使用
也可以使用
我需要获取一个名称中带有点的属性的值。我正在努力逃离这个点。
get_json_object($"AColumn", "$.something.id")
我试过"$。CCD_ 1"$。[‘something.id’]"$。某些".id";这些似乎都不起作用。
不幸的是,文档非常轻。
以前有人成功地做到这一点吗?有人能说明一下情况吗?
试试这个-
加载测试数据
val df = Seq(("p1", """{"a.id": 1, "b": 2}"""), ("p2", """{"a.id": 3}"""))
.toDF("p_id", "p_meta")
df.show(false)
df.printSchema()
/**
* +----+-------------------+
* |p_id|p_meta |
* +----+-------------------+
* |p1 |{"a.id": 1, "b": 2}|
* |p2 |{"a.id": 3} |
* +----+-------------------+
*
* root
* |-- p_id: string (nullable = true)
* |-- p_meta: string (nullable = true)
*/
使用get_json_object
如下
df.withColumn("x", get_json_object($"p_meta", "$['a.id']"))
.show(false)
/**
* +----+-------------------+---+
* |p_id|p_meta |x |
* +----+-------------------+---+
* |p1 |{"a.id": 1, "b": 2}|1 |
* |p2 |{"a.id": 3} |3 |
* +----+-------------------+---+
*/
也可以使用json_tuple
df.withColumn("x", json_tuple($"p_meta", "a.id"))
.show(false)
/**
* +----+-------------------+---+
* |p_id|p_meta |x |
* +----+-------------------+---+
* |p1 |{"a.id": 1, "b": 2}|1 |
* |p2 |{"a.id": 3} |3 |
* +----+-------------------+---+
*/
不要使用get_json_object()
,而是尝试使用json_tuple((函数。
Example:
df.show(false)
//+---------------------+
//|c |
//+---------------------+
//|{"id.i":1,"name":"a"}|
//+---------------------+
df.withColumn("gjo",json_tuple(col("c"),"id.i")).show(false)
//+---------------------+---+
//|c |gjo|
//+---------------------+---+
//|{"id.i":1,"name":"a"}|1 |
//+---------------------+---+
//we can keep multiple json keys
sql("""select json_tuple(c,"id.i","name") from tmp""").show(false)
//+---+---+
//|c0 |c1 |
//+---+---+
//|1 |a |
//+---+---+
Option2:
使用from_json()
函数读取使用StructType
模式的json字符串。
import org.apache.spark.sql.types._
import org.apache.spark.sql.functions._
val sch=new StructType().add("id.i",IntegerType).add("name",StringType)
df.withColumn("fj",from_json(col("c"),sch)).select("fj.*")show()
//+----+----+
//|id.i|name|
//+----+----+
//| 1| a|
//+----+----+
然后,您可以使用.map
、something.id
0和.withColumnRenamed()
函数替换列名。