我有一个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
那么,选择这些数据的神奇方法是什么?或者甚至支持了吗?
答案 0 :(得分:7)
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|
## +---+