如何转义点中点语法,例如在get_json_object中



我需要获取一个名称中带有点的属性的值。我正在努力逃离这个点。

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|
//+----+----+

然后,您可以使用.mapsomething.id0.withColumnRenamed()函数替换列名

最新更新