Spark 在多行中分解多列行

Spark explode multiple columns of row in multiple rows

我在将使用三个 3 列的一行转换为 3 行时遇到问题
例如:

 <pre>
<b>ID</b> |  <b>String</b>  |  <b>colA</b> | <b>colB</b> | <b>colC</b>
<em>1</em>  | <em>sometext</em> |   <em>1</em>   |  <em>2</em>   |  <em>3</em>
</pre>

我需要将其转换成:

<pre>
<b>ID</b> |  <b>String</b>  |  <b>resultColumn</b>
<em>1</em>  | <em>sometext</em> |     <em>1</em>  
<em>1</em>  | <em>sometext</em> |     <em>2</em>   
<em>1</em>  | <em>sometext</em> |     <em>3</em>    
</pre>

我只有与第一个模式 (table) 连接的数据框。

val df: dataFrame

注意:我可以使用 RDD 来完成,但我们还有其他方法吗?谢谢

假设 df 具有您的第一个代码段的架构,我会尝试:

df.select($"ID", $"String", explode(array($"colA", $"colB",$"colC")).as("resultColumn"))

如果您还想保留列名,您可以使用一个技巧,即创建一个包含值和名称数组的数组列。首先创建你的表达式

val expr = explode(array(array($"colA", lit("colA")), array($"colB", lit("colB")), array($"colC", lit("colC"))))

然后使用getItem(因为你不能在嵌套表达式上使用生成器,所以你需要2 select

df.select($"ID, $"String", expr.as("tmp")).select($"ID", $"String", $"tmp".getItem(0).as("resultColumn"), $"tmp".getItem(1).as("columnName"))

虽然有点冗长,但可能有更优雅的方法。