我正在尝试不同的方法来查询记录数组中的记录并显示完整的Row作为输出。
我不知道哪个嵌套对象有字符串“pg”。但我想查询特定的对象。对象是否具有“pg”。如果“pg”存在,那么我想显示完整的行。如何在嵌套对象上编写“spark sql query”而不指定对象索引。所以我不想使用children.name的索引
我的Avro记录:
{
"name": "Parent",
"type":"record",
"fields":[
{"name": "firstname", "type": "string"},
{
"name":"children",
"type":{
"type": "array",
"items":{
"name":"child",
"type":"record",
"fields":[
{"name":"name", "type":"string"}
]
}
}
}
]
}
我正在使用Spark SQL上下文来查询读取的数据帧。 所以如果输入是
Row no Firstname Children.name
1 John Max
Pg
2 Bru huna
aman
输出应该返回poq 1,因为它有一行,其中一个children.name对象是pg。
val results = sqlc.sql("SELECT firstname, children.name FROM nestedread where children.name = 'pg'")
results.foreach(x=> println(x(0), x(1).toString))
以上查询不起作用。但是当我查询孩子[1] .name。
时它会起作用我还想知道如果我可以过滤一组记录然后爆炸。而不是先爆炸并创建大量行然后过滤。
答案 0 :(得分:4)
似乎你可以使用
org.apache.spark.sql.functions.explode(e: Column): Column
例如在我的项目中(在java中),我有这样的嵌套json:
{
"error": [],
"trajet": [
{
"something": "value"
}
],
"infos": [
{
"something": "value"
}
],
"timeseries": [
{
"something_0": "value_0",
"something_1": "value_1",
...
"something_n": "value_n"
}
]
}
我想分析“时间序列”中的数据,所以我做了:
DataFrame ts = jsonDF.select(org.apache.spark.sql.functions.explode(jsonDF.col("timeseries")).as("t"))
.select("t.something_0",
"t.something_1",
...
"t.something_n");
我也是新手。希望这可以给你一个提示。
答案 1 :(得分:0)
问题由
解决我找到了通过爆炸的方法。
val results = sqlc.sql("SELECT firstname, child.name, FROM parent LATERAL VIEW explode(children) childTable AS child