我在配置单元表中有一列:
列名:过滤器
数据类型:
|-- filters: array (nullable = true)
| |-- element: struct (containsNull = true)
| | |-- name: string (nullable = true)
| | |-- value: string (nullable = true)
我想从这个列中得到对应名称的值。
到目前为止我所做的:
val sdf: DataFrame = sqlContext.sql("select * from <tablename> where id='12345'")
val sdfFilters = sdf.select("filters").rdd.map(r => r(0).asInstanceOf[Seq[(String,String)]]).collect()
Output: sdfFilters: Array[Seq[(String, String)]] = Array(WrappedArray([filter_RISKFACTOR,OIS.SPD.*], [filter_AGGCODE,IR]), WrappedArray([filter_AGGCODE,IR_]))
注意:强制转换为seq,因为wrappedarray到map的转换是不可能的。
下一步怎么办?
1条答案
按热度按时间ecr0jaav1#
如果您希望以简单可靠的方式按名称获取所有值,可以使用“分解和筛选”将表展平:
您还可以按任何方式收集数据:
如果你想投
array[struct]
至map[string, string]
为了将来保存到某个存储中,情况就不同了,这个问题最好由udf来解决。不管怎样,你必须避免collect()
尽可能保持代码的可伸缩性。