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的类型安全性如何发挥作用 例如: 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] (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |