数组中第 n 项的 SparkSQL sql 语法
SparkSQL sql syntax for nth item in array
我有一个 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
那么,select 该数据的神奇方法是什么?或者甚至还支持吗?
不清楚你所说的 JSON object 是什么意思,所以让我们考虑两种不同的情况:
结构数组
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|
## +---+
另见
我有一个 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
那么,select 该数据的神奇方法是什么?或者甚至还支持吗?
不清楚你所说的 JSON object 是什么意思,所以让我们考虑两种不同的情况:
结构数组
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| ## +---+
另见