我有一张镶有 table 的镶木 table
,array <struct <col1,col2,.. colN >>
可以使用LATERAL VIEW语法在Hive中对此表运行查询 .
如何将此表读入RDD,更重要的是如何在Spark中过滤,映射等嵌套集合?
在Spark文档中找不到对此的任何引用 . 提前感谢您的任何信息!
PS . 感觉可能有助于在 table 上给出一些统计数据 . 主表~600中的列数 . 行数~200m . 嵌套集合中的“列”数〜10 . 平均集合中的平均记录数~35 .
4 回答
在嵌套集合的情况下没有魔力 . Spark将以
RDD[(String, String)]
和RDD[(String, Seq[String])]
的相同方式处理 .但是,从Parquet文件中读取这样的嵌套集合可能会很棘手 .
我们来自
spark-shell
(1.3.1)的例子:写下镶木地板文件:
阅读镶木地板文件:
重要的是
row.getAs[Seq[Row]](1)
. 嵌套序列struct
的内部表示是ArrayBuffer[Row]
,您可以使用它的任何超类型而不是Seq[Row]
.1
是外行中的列索引 . 我在这里使用了getAs
方法,但最新版本的Spark还有其他选择 . 请参阅Row trait的源代码 .现在您有一个
RDD[Outer]
,您可以应用任何想要的转换或操作 .请注意,我们仅使用spark-SQL库来读取镶木地板文件 . 例如,您可以在将数据映射到RDD之前直接在DataFrame上选择所需的列 .
我会给出一个基于Python的答案,因为那是我正在使用的 . 我认为Scala有类似的东西 .
根据Python API docs,在Spark 1.4.0中添加了
explode
函数来处理DataFrames中的嵌套数组 .创建测试数据框:
使用
explode
展平列表列:另一种方法是使用这样的模式匹配:
您可以直接在Row上进行模式匹配,但由于某些原因可能会失败 .
以上答案都是很好的答案,并从不同方面解决这个问题; Spark SQL也是访问嵌套数据的非常有用的方法 .
下面是如何在SQL中直接使用explode()来查询嵌套集合的示例 .
tsp_ids是一个嵌套的结构体,它有许多属性,包括我在上面的外部查询中选择的person_seq_no .
以上是在Spark 2.0中测试的 . 我做了一个小测试,它在Spark 1.6中不起作用 . 当Spark 2不在时问这个问题,所以这个答案很好地补充了处理嵌套结构的可用选项列表 .
在用于SQL访问的explode()上,无法解析JIRA:
SPARK-13721: Add support for LATERAL VIEW OUTER explode()
SPARK-7549: Support aggregating over nested fields