Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将spark数组列分解为多列sparksql_Java_Scala_Apache Spark_Apache Spark Sql - Fatal编程技术网

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应该是相同的。