首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将参数动态传递给scala中的函数

将参数动态传递给scala中的函数
EN

Stack Overflow用户
提问于 2018-06-02 05:07:55
回答 1查看 845关注 0票数 -1

我的记录是包含1000个字段的字符串,在dataframe中使用分隔符作为逗号,例如

"a,b,c,d,e.......upto 1000“-第1条记录"p,q,r,s,t ......upto 1000”-第2条记录

我使用的是来自stackoverflow的以下建议解决方案

Split 1 column into 3 columns in spark scala

代码语言:javascript
复制
df.withColumn("_tmp", split($"columnToSplit", "\\.")).select($"_tmp".getItem(0).as("col1"),$"_tmp".getItem(1).as("col2"),$"_tmp".getItem(2).as("col3")).drop("_tmp")

然而,在我的例子中,我有1000列,这些列在JSON模式中,我可以像这样检索

代码语言:javascript
复制
column_seq:Seq[Array]=Schema_func.map(_.name)
for(i <-o to column_seq.length-1){println(i+" " + column_seq(i))}

它返回的结果如下

0 col1 1 col2 2 col3 3 col4

现在,我需要将所有这些索引和列名传递给DataFrame的以下函数

代码语言:javascript
复制
df.withColumn("_tmp", split($"columnToSplit", "\\.")).select($"_tmp".getItem(0).as("col1"),$"_tmp".getItem(1).as("col2"),$"_tmp".getItem(2).as("col3")).drop("_tmp")

在……里面

代码语言:javascript
复制
$"_tmp".getItem(0).as("col1"),$"_tmp".getItem(1).as("col2"),

由于我不能创建包含1000列的long语句,有没有任何有效的方法可以将上面提到的json schema中的所有这些参数传递给select函数,这样我就可以拆分列,添加头,然后将DF转换为parquet。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-02 05:44:13

您可以构建一系列org.apache.spark.sql.Column,其中每个列都是选择正确的项并具有正确的名称的结果,然后select这些列:

代码语言:javascript
复制
val columns: Seq[Column] = Schema_func.map(_.name)
  .zipWithIndex // attach index to names
  .map { case (name, index) => $"_tmp".getItem(index) as name }

val result = df
  .withColumn("_tmp", split($"columnToSplit", "\\."))
  .select(columns: _*)

例如,对于此输入:

代码语言:javascript
复制
case class A(name: String)
val Schema_func = Seq(A("c1"), A("c2"), A("c3"), A("c4"), A("c5"))
val df = Seq("a.b.c.d.e").toDF("columnToSplit")

result将为:

代码语言:javascript
复制
// +---+---+---+---+---+
// | c1| c2| c3| c4| c5|
// +---+---+---+---+---+
// |  a|  b|  c|  d|  e|
// +---+---+---+---+---+
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50651014

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档