Kri*_*ian 4 python apache-spark apache-spark-sql pyspark
我有一个json对象,它有一个不幸的嵌套和数组组合.所以用spark sql查询它并不是很明显.
这是一个示例对象:
{
stuff: [
{a:1,b:2,c:3}
]
}
Run Code Online (Sandbox Code Playgroud)
所以,在javascript中,为了获得价值c,我会写myData.stuff[0].c
在我的spark sql查询中,如果该数组不存在,我将能够使用点表示法:
SELECT stuff.c FROM blah
Run Code Online (Sandbox Code Playgroud)
但我不能,因为最里面的对象被包裹在一个数组中.
我试过了:
SELECT stuff.0.c FROM blah // FAIL
SELECT stuff.[0].c FROM blah // FAIL
Run Code Online (Sandbox Code Playgroud)
那么,选择这些数据的神奇方法是什么?或者甚至支持了吗?
目前尚不清楚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|
## +---+
Run Code Online (Sandbox Code Playgroud)一系列地图
# 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|
## +---+
Run Code Online (Sandbox Code Playgroud)另请参阅使用复杂类型查询Spark SQL DataFrame
| 归档时间: |
|
| 查看次数: |
9229 次 |
| 最近记录: |