Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 如何将多个案例类的RDD转换为其组件的RDD_Apache Spark_Rdd_Case Class - Fatal编程技术网

Apache spark 如何将多个案例类的RDD转换为其组件的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)将其保

我有一个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)将其保存到配置单元表中时,它会创建一个二维表结构:

_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:无法使用空组写入架构:消息根{}