Apache spark 如何将多个案例类的RDD转换为其组件的RDD
我有一个Spark RDD,它是两个案例类的一种类型,类似于:Apache spark 如何将多个案例类的RDD转换为其组件的RDD,apache-spark,rdd,case-class,Apache Spark,Rdd,Case Class,我有一个Spark RDD,它是两个案例类的一种类型,类似于: RDD[(ACTKey, UIDSKey)] 案例类定义如下: case class ACTKey(ACCOUNT: Int, PERIOD: String, COUNTRY: String) case class UIDSKey(PRODUCT: String, UNIT: String, ID: Int) 当我通过调用dataframe.saveAsTable(“MyTable”,SaveMode.Overwrite)将其保
RDD[(ACTKey, UIDSKey)]
案例类定义如下:
case class ACTKey(ACCOUNT: Int, PERIOD: String, COUNTRY: String)
case class UIDSKey(PRODUCT: String, UNIT: String, ID: Int)
当我通过调用dataframe.saveAsTable(“MyTable”,SaveMode.Overwrite)将其保存到配置单元表中时,它会创建一个二维表结构:
_1 (struct<ACCOUNT:int,PERIOD:string,COUNTRY:string>)
_2 (struct<PRODUCT:string,UNIT:string, ID:int>)
\u 1(结构)
_2(结构)
我希望有一个简单的表结构,如下所示:
账户:整数,期间:字符串,国家:字符串,产品:字符串,单位:字符串,ID:int
一种方法是手动将我的RDD映射到case类的各个组件中,比如map(x=>(x.\u 1.ACCOUNT,x.\u 1.PERIOD,…等等),但是如果我的case类发生变化,那么有太多的硬编码必须改变。因此,我正在寻找一种更为优雅的解决方案,例如,可以将我的RDD结构展平,用于基于一组案例类的任何RDD。尝试以下方法:
rdd.toDF().select("_1.*", "_2.*")
.write
.format("parquet")
.mode(SaveMode.Overwrite)
.saveAsTable("MyTable")
试试这个:
rdd.toDF().select("_1.*", "_2.*")
.write
.format("parquet")
.mode(SaveMode.Overwrite)
.saveAsTable("MyTable")
如果在
case类
中添加另一个类似def extract=(this.ACCOUNT、this.PERIOD、this.COUNTRY)的方法,比如extract
,会怎么样
这与我上面描述的映射非常相似,我正试图避免这种情况——对类属性进行硬编码,因为实际上我有大量的属性。此外,它们在开发过程中可能会发生变化,如果将它们放在多个位置可能会导致丢失其中的一些,如果在case类中添加另一种方法,如extract
,如def extract=(this.ACCOUNT,this.PERIOD,this.COUNTRY)如何
这与我上面描述的映射非常相似,我正试图避免这种情况——对类属性进行硬编码,因为实际上我有大量的属性。此外,它们可能会在开发过程中发生更改,并且在多个位置放置它们可能会导致丢失其中一些。这与以下错误不起作用:原因:parquet.schema.InvalidSchemaException:无法使用空组编写架构:消息根{}这不适用于以下错误:原因:parquet.schema.InvalidSchemaException:无法使用空组写入架构:消息根{}