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

scala – 如何在不转换DataFrame并访问数据集的情况下向数据集添

发布时间:2020-12-16 18:55:06 所属栏目:安全 来源:网络整理
导读:我知道使用.withColumn()和一个返回DataFrame的UDF向Spark DataSet添加新列的方法.我也知道,我们可以将生成的DataFrame转换为DataSet. 我的问题是: 如果我们仍然遵循传统的DF方法(即将列名称作为UDF输入的字符串传递),DataSet的类型安全性如何发挥作用 是否
我知道使用.withColumn()和一个返回DataFrame的UDF向Spark DataSet添加新列的方法.我也知道,我们可以将生成的DataFrame转换为DataSet.

我的问题是:

>如果我们仍然遵循传统的DF方法(即将列名称作为UDF输入的字符串传递),DataSet的类型安全性如何发挥作用
>是否存在访问列的“面向对象的方式”(不将列名作为字符串传递),就像我们以前用RDD一样,用于追加新列.
>如何在正常操作中访问新列,如map,filter等?

例如:

scala> case class Temp(a : Int,b : String)    //creating case class
    scala> val df = Seq((1,"1str"),(2,"2str),(3,"3str")).toDS    // creating DS
    scala> val appendUDF = udf( (b : String) => b + "ing")      // sample UDF

    scala> df.withColumn("c",df("b"))   // adding a new column
    res5: org.apache.spark.sql.DataFrame = [a: int,b: string ... 1 more field]

    scala> res5.as[Temp]   // converting to DS
    res6: org.apache.spark.sql.Dataset[Temp] = [a: int,b: string ... 1 more field]

    scala> res6.map( x =>x.  
    // list of autosuggestion :
    a   canEqual   equals     productArity     productIterator   toString   
    b   copy       hashCode   productElement   productPrefix

我使用.withColumn()添加的新列c是不可访问的,因为列c在使用res5.as转换为DS的瞬间不在类Temp(它只包含& b)的情况下[温度].

如何访问列c?

解决方法

在类型安全的数据集世界中,您将结构映射到另一个.

也就是说,对于每次转换,我们都需要数据的模式表示(因为它是RDD所需的).要访问上面的“c”,我们需要创建一个新模式来提供对它的访问.

case class A(a:String)
case class BC(b:String,c:String)
val f:A => BC = a=> BC(a.a,"c") // Transforms an A into a BC

val data = (1 to 10).map(i => A(i.toString))
val dsa = spark.createDataset(data)
// dsa: org.apache.spark.sql.Dataset[A] = [a: string]

val dsb = dsa.map(f)
//dsb: org.apache.spark.sql.Dataset[BC] = [b: string,c: string]

(编辑:李大同)

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

    推荐文章
      热点阅读