SparkSQL DataFrame Select时传入可变参数

最近有个新需求用到spark动态读取数据源,因数据源列名通过json传入,而且业务场景是只用DataFrame做不好用SQL处理。

一开始错误代码示例:

   val ds: Dataset[String] = sparkSession.read.textFile("input/user.txt","input/traffics.txt")
    ds.show(20)
    val result = ds.map(x=>{
      val str = x.split(" ")

     (str(0),str(1))
    }).toDF("id","month")

    result.select("id","month").show()//能正常执行
	//模拟传入的列名
    val list = List("id","month") 
    result.select(list.mkString(","))//出错

报错如下:

Exception in thread "main" java.lang.reflect.InvocationTargetException
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at com.intellij.rt.execution.CommandLineWrapper.main(CommandLineWrapper.java:64)
Caused by: org.apache.spark.sql.AnalysisException: cannot resolve '`id,month`' given input columns: [id, month];;
'Project ['id,month]
+- Project [_1#16 AS id#19, _2#17 AS month#20]
......

大概意思就是把 id,month 作为了一个字符串了,而DF中没有这个列名,故出错,
查看select api 可知需要的是一个可变参数列表

/**
   * Selects a set of columns. This is a variant of `select` that can only select
   * existing columns using column names (i.e. cannot construct expressions).
   *
   * {{{
   *   // The following two are equivalent:
   *   ds.select("colA", "colB")
   *   ds.select($"colA", $"colB")
   * }}}
   *
   * @group untypedrel
   * @since 2.0.0
   */
  @scala.annotation.varargs
  def select(col: String, cols: String*): DataFrame = select((col +: cols).map(Column(_)) : _*)

所以解决如下:

// List[String] 转化为 List[Column] 类型即可
 val list = List("id","month").map(col(_)) 
 // list[Column]作为可变参传入即可
 result.select(list: _*).show()

仅作为个人学习记录,其实开发中绕过这个问题拼接SQL也是同样能处理的。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冬瓜螺旋雪碧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值