Apache spark 嵌套记录上的Spark Sql查询。我想先过滤嵌套的记录数组,然后分解(将它们展开成行)
我想首先只过滤具有Max的行,然后只分解嵌套列中具有Max的行 我的Avro记录:Apache spark 嵌套记录上的Spark Sql查询。我想先过滤嵌套的记录数组,然后分解(将它们展开成行),apache-spark,apache-spark-sql,hiveql,parquet,Apache Spark,Apache Spark Sql,Hiveql,Parquet,我想首先只过滤具有Max的行,然后只分解嵌套列中具有Max的行 我的Avro记录: { "name": "Parent", "type":"record", "fields":[ {"name": "firstname", "type": "string"}, { "name":"children", "type":{ "type": "array", "items":{
{
"name": "Parent",
"type":"record",
"fields":[
{"name": "firstname", "type": "string"},
{
"name":"children",
"type":{
"type": "array",
"items":{
"name":"child",
"type":"record",
"fields":[
{"name":"name", "type":"string"}
{"name":"price","type":["long", "null"]}
]
}
}
}
]
}
我正在使用Spark SQL上下文查询读取的数据帧。所以如果输入是
Row no Firstname Children.name
1 John [[Max, 20],[Pg, 22]]
2 Bru [[huna, 10], [aman, 12]]
我首先通过分解内部表进行查询。所以嵌套列被拆分为两行
Row no Firstname Children.name children.price
1 John Max 20
1 John Pg 22
2 Bru huna 10
2 Bru aman 12
q1)我想首先只过滤最大值的行,然后只分解最大值的行。在当前情况下,如果一列中有一百万个值,那么它首先生成一百万行,然后检查Max是否存在
问题2)我想首先只过滤price>12的行,然后只分解price>12的行。在当前情况下,如果一列中有一百万个值,则首先生成一百万行,然后检查是否存在price>12
大概是这样的:
val results=sqlc.sql(“从父侧视图中选择firstname,child.name分解(children)childTable作为child,其中child.price>12”)以下是两个问题的答案: ans1)如果要查找嵌套记录数组中是否存在“字符串”:
var results = sqlc.sql("SELECT firstname, children.name FROM parent where array_contains(children['name'], 'pg') ")
ans2)如果要对嵌套记录数组应用条件。使用自定义项
sqlc.udf.register("myPriceFilter", (price: mutable.WrappedArray[String]) => (price exists (a => (a.toLong < 67735) )))
var results = sqlc.sql("SELECT firstname, explode(children.price) FROM parent where myPriceFilter(children['price']) ")
sqlc.udf.register(“myPriceFilter”,(price:mutable.WrappedArray[String])=>(price存在(a=>(a.toLong<67735)))
var results=sqlc.sql(“从myPriceFilter(children['price'])所在的父级中选择firstname,explode(children.price))
筛选包含max的子项名称,以创建新的数据帧,然后分解。你试过了吗?下面的查询无效val results=sqlc.sql(“SELECT firstname,children.name FROM parent,where children.name='Max')我说的包含不等于。您可以在spark scala文档中找到所有可以使用的sql函数,也请查看您的其他问题!他们暂时悬而未决。