Java 将spark数组列分解为多列sparksql
我有一个列,其类型Java 将spark数组列分解为多列sparksql,java,scala,apache-spark,apache-spark-sql,Java,Scala,Apache Spark,Apache Spark Sql,我有一个列,其类型Value定义如下 val Value: ArrayType = ArrayType( new StructType() .add("unit", StringType) .add("value", StringType) ) unit1 unit2 25 77 40 100 value1 88 33 value2 还有像这样的数据 [[unit1, 25], [unit2, 77]] [[unit2, 100], [
Value
定义如下
val Value: ArrayType = ArrayType(
new StructType()
.add("unit", StringType)
.add("value", StringType)
)
unit1 unit2
25 77
40 100
value1 88
33 value2
还有像这样的数据
[[unit1, 25], [unit2, 77]]
[[unit2, 100], [unit1, 40]]
[[unit2, 88]]
[[unit1, 33]]
我知道spark sql可以使用functions.explode将数据分解为多行,但我想要的是分解为多列(或者一列两项,一列只有一项)
最终结果如下所示
val Value: ArrayType = ArrayType(
new StructType()
.add("unit", StringType)
.add("value", StringType)
)
unit1 unit2
25 77
40 100
value1 88
33 value2
我怎样才能做到这一点
首次发布和更新后添加
我想得到这样的结果(这更像是我的最终目标)
其中,value1
是使用[unit2,88]
类似地,
value2
是使用[unit1,33]
应用相同的映射/转换函数的结果。我使用@jxc建议的map\u from\u entries
解决了这个问题,然后使用UDF
将1个项目的映射转换为2个项目的映射,使用业务逻辑在两个单元之间进行转换
需要注意的一点是,从_条目返回的映射是scala映射。如果使用java
,则需要确保udf方法采用scala
map
ps.也许我不必使用map\u from\u条目,相反,也许我可以使用
UDF
来获取structType
的array
,如何计算结果数据中的第二行?数组是否总是只有一个或两个元素,或者可以有更多元素?@Minnie,预期的结果不应该像(unit1,unit2):(25,27),(40100),(null,88),(33,null)
?嗨@werner,它是一个或两个项目。再好不过了。在仔细阅读了您和LeoC所说的内容后,我才意识到我的模拟结果有错误。我现在已经更新了它。您好@LeoC,对不起,您是对的,我将更新预期结果。您可以使用map\u from\u entries
将列转换为地图,然后按以下键选择地图:unit1和unit2。顺便说一句,这是一个pyspark链接,Scala应该是相同的。