2017-09-23 40 views
0

的选择EXPR我是很新的Scala编程,所以这可能是一个基本的问题使用生成的字符串在数据帧

我计划动态创建一个数据帧。

这是我的最终目标:

val df2 = df1.select("col1","col2","col3") 

我产生这些列名如下,并保存到这样一个变量的函数:

scala> val colVar = generateColSelectionString(4) 
colVar: String = col1,col2,col3 

现在,

如何我是否这样做:

val df2 = df1.select(colVar) 

回答

3

您可以分割字符串,并使用selectExpr

val df = Seq((1,2,3)).toDF("col1","col2","col3") 

val colVar = "col1,col2,col3" 

df.selectExpr(colVar.split(","):_*).show 
+----+----+----+ 
|col1|col2|col3| 
+----+----+----+ 
| 1| 2| 3| 
+----+----+----+ 
+1

这很快!谢谢:) –

+0

如何在groupBy()中做同样的事情 –

+1

对于'groupBy',你可以做类似'val cols = colVar.split(“,”); df.groupBy(cols.head,cols.tail:_ *)。agg(...)' – Psidom

2

拆分 “colVar” 变量,并使用 “选择” 有两个参数:

val data = List(("v1", "v2", "v3")) 
val df = sparkContext.parallelize(data).toDF("col1", "col2", "col3") 

val colVar = "col1,col2,col3" 
val columnList = colVar.split(",") 
val result = df.select(columnList.head, columnList.tail: _*) 
result.show(false) 

输出:

+----+----+----+ 
|col1|col2|col3| 
+----+----+----+ 
|v1 |v2 |v3 | 
+----+----+----+ 
+0

谢谢很多,因为我在同一时间得到了两个答案,我接受了名单中的第一个 –