加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如何使用Scala从Spark中的List或Array创建Row

发布时间:2020-12-16 09:26:27 所属栏目:安全 来源:网络整理
导读:我正在尝试根据用户输入创建一个Row(org.apache.spark.sql.catalyst.expressions.Row).我无法随机创建一行. 是否有任何功能可以从列表或数组创建行. 例如,如果我有一个.csv文件,格式如下, "91xxxxxxxxxx,21.31,15,0" 如果用户输入[1,2],那么我只需要第二列和
我正在尝试根据用户输入创建一个Row(org.apache.spark.sql.catalyst.expressions.Row).我无法随机创建一行.

是否有任何功能可以从列表或数组创建行.

例如,如果我有一个.csv文件,格式如下,

"91xxxxxxxxxx,21.31,15,0"

如果用户输入[1,2],那么我只需要第二列和第三列以及第一列customer_id

我尝试用代码解析它:

val l3 = sc.textFile("/SparkTest/abc.csv").map(_.split(" ")).map(r => (foo(input,r(0)))) `

其中foo定义为

def f(n: List[Int],s: String) : Row = {
    val n = input.length
    var out = new Array[Any](n+1)
    var r = s.split(",")
    out(0) = r(0)
    for (i <- 1 to n)
        out(i) = r(input(i-1)).toDouble
    Row(out)
}

和输入是一个List说

val input = List(1,2)

执行此代码我得到l3:

Array[org.apache.spark.sql.Row] = Array([[Ljava.lang.Object;@234d2916])

但我想要的是:

Array[org.apache.spark.sql.catalyst.expressions.Row] = Array([9xxxxxxxxxx,15])`

必须传递此内容才能在Spark SQL中创建模式

解决方法

像下面这样的东西应该工作:

import org.apache.spark.sql._

def f(n: List[Int],s: String) : Row =
  Row.fromSeq(s.split(",").zipWithIndex.collect{case (a,b) if n.contains(b) => a}.toSeq)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读