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"))
虽然有点冗长,但可能有更优雅的方法。
我在将使用三个 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"))
虽然有点冗长,但可能有更优雅的方法。