我有一个json对象,它不幸地结合了嵌套和数组。因此,如何使用 Spark sql 查询它并不完全明显。
下面是一个示例对象:
{
stuff: [
{a:1,b:2,c:3}
]
}
所以,在javascript中,为了得到c
的值,我会写myData.stuff[0].c
在我的 spark sql 查询中,如果该数组不存在,我将能够使用点表示法:
SELECT stuff.c FROM blah
但我不能,因为最里面的对象被包装在一个数组中。
我试过:
SELECT stuff.0.c FROM blah // FAIL
SELECT stuff.[0].c FROM blah // FAIL
那么,选择这些数据的神奇方法是什么? 或者甚至还支持吗?
目前尚不清楚 JSON 对象的含义,因此让我们考虑两种不同的情况:
-
结构数组
import tempfile path = tempfile.mktemp() with open(path, "w") as fw: fw.write('''{"stuff": [{"a": 1, "b": 2, "c": 3}]}''') df = sqlContext.read.json(path) df.registerTempTable("df") df.printSchema() ## root ## |-- stuff: array (nullable = true) ## | |-- element: struct (containsNull = true) ## | | |-- a: long (nullable = true) ## | | |-- b: long (nullable = true) ## | | |-- c: long (nullable = true) sqlContext.sql("SELECT stuff[0].a FROM df").show() ## +---+ ## |_c0| ## +---+ ## | 1| ## +---+
-
地图数组
# Note: schema inference from dictionaries has been deprecated # don't use this in practice df = sc.parallelize([{"stuff": [{"a": 1, "b": 2, "c": 3}]}]).toDF() df.registerTempTable("df") df.printSchema() ## root ## |-- stuff: array (nullable = true) ## | |-- element: map (containsNull = true) ## | | |-- key: string ## | | |-- value: long (valueContainsNull = true) sqlContext.sql("SELECT stuff[0]['a'] FROM df").show() ## +---+ ## |_c0| ## +---+ ## | 1| ## +---+
另请参阅使用复杂类型查询 Spark SQL 数据帧