Spark会在多行中爆炸多列行

时间:2018-01-23 13:50:35

标签: scala apache-spark-sql spark-dataframe converter explode

我有一个问题,即使用三个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>
&#13;
&#13;
&#13;

我需要将其转换为:

&#13;
&#13;
<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>
&#13;
&#13;
&#13;

我只有dataFrame,它与第一个模式(表)相关联。

val df: dataFrame

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

1 个答案:

答案 0 :(得分:1)

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

@IBOutlet var backButtonView: UIView!

override func viewDidLoad() {
    super.viewDidLoad()

    let backButton = UIBarButtonItem(customView: self.backButtonView)
    self.backButtonView.heightAnchor.constraint(equalToConstant: 44).isActive = true // if you set more than you'll get "Unable to simultaneously..."
    self.backButtonView.widthAnchor.constraint(equalToConstant: 75).isActive = true
    self.navigationItem.leftBarButtonItem = backButton
}

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

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")))) (因为你不能在嵌套表达式上使用生成器,你需要2 getItem

select

虽然有点冗长,但可能会有更优雅的方式来做到这一点。