【发布时间】:2020-03-12 06:05:42
【问题描述】:
给定这样一个深度嵌套的 parquet 结构
|-- bet: struct (nullable = true)
| |-- sides: array (nullable = true)
| | |-- element: struct (containsNull = true)
| | | |-- side: string (nullable = true)
| | | |-- betID: string (nullable = true)
| | | |-- secondarybetID: string (nullable = true)
| | | |-- parties: struct (nullable = true)
| | | | |-- partyIDs: array (nullable = true)
| | | | | |-- element: struct (containsNull = true)
| | | | | | |-- partyID: string (nullable = true)
| | | | | | |-- partyRole: integer (nullable = true)
| | | | | | |-- partySubGrp: struct (nullable = true)
| | | | | | | |-- partySubIDs: array (nullable = true)
| | | | | | | | |-- element: struct (containsNull = true)
| | | | | | | | | |-- partySubID: string (nullable = true)
| | | | | | | | | |-- partySubIDType: integer (nullable = true)
考虑到一个赌注有几个方面,不知何故,我们只对边数数组中的第一边感兴趣。 如何找到partyRole为10的一方的参与方?
在 prestosql 中我可以做类似的事情
SELECT
filter(bet.sides[1].parties.partyids, x -> x.partyrole=10)[1] as party10
FROM
parquetbets
WHERE
cardinality(filter(bet.sides[1].parties.partyids, x -> x.partyrole=10))>0
如何在 spark2 sql 中做同样的事情?
SELECT bet.sides[1] from parquetbets
在 spark2 sql 中,上面返回一个数组,在嵌套结构上没有进一步修剪的范围?
即
SELECT bet.sides[1].parties from parquetbets
返回空值。我尝试了一些组合,但结果返回 WrappedArrayElements,它不提供查询嵌套数据的机制。 在 prestosql 中返回的结果包含字段名称,以便于继续深入研究结构。
有人能告诉我 spark2 sql 如何支持这个吗? 如果 spark2 sql 不能,那么 spark 数据帧如何做到这一点?
【问题讨论】:
标签: apache-spark apache-spark-sql parquet trino spark2