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
Scala “解组”;“展平”;,是其他案例类的组合的案例类_Scala_Apache Spark - Fatal编程技术网

Scala “解组”;“展平”;,是其他案例类的组合的案例类

Scala “解组”;“展平”;,是其他案例类的组合的案例类,scala,apache-spark,Scala,Apache Spark,一般来说,我想要达到的目标是: 我想我想从RDD中删除case类,但保留RDD,我不确定如何做到这一点 具体地说,我想做的是: 我试图实现的是将RDD的每一行转换为json。但是json只能是一个包含key:value对的列表。当我把它转换成json的当前形式时,我得到 {"CCABINDeviceDataPartial": {"Tran_Id":"1234weqr", "TranData":{"Processor_Id":"qqq","Merchant_Id":"1234"}

一般来说,我想要达到的目标是: 我想我想从RDD中删除case类,但保留RDD,我不确定如何做到这一点

具体地说,我想做的是: 我试图实现的是将RDD的每一行转换为json。但是json只能是一个包含key:value对的列表。当我把它转换成json的当前形式时,我得到

{"CCABINDeviceDataPartial":
    {"Tran_Id":"1234weqr",
     "TranData":{"Processor_Id":"qqq","Merchant_Id":"1234"},
     "BillingAndShippingData":{"Billing_City":"MyCity","Billing_State":"State","Billing_Zip":"000000","Billing_Country":"MexiCanada","Shipping_City":"MyCity","Shipping_State":"State","Shipping_Zip":"000000","Shipping_Country":"USico"}
     ...
    }
}
我想要的是

{"Tran_Id":"1234weqr",
 "Processor_Id":"qqq",
 "Merchant_Id":"1234",
 "Billing_City":"MyCity",
 "Billing_State":"State",
 "Billing_Zip":"000000",
 "Billing_Country":"MexiCanada",
 "Shipping_City":"MyCity",
 "Shipping_State":"State",
 "Shipping_Zip":"000000",
 "Shipping_Country":"USico"
 ...
}
我有一个我称之为parent case的类,它如下所示:

case class CCABINDeviceDataPartial(Tran_Id: String, TranData: TranData,
    BillingAndShippingData: BillingAndShippingData, AcquirerData: AcquirerData,
    TimingData: TimingData, RBD_Tran_Id: String, DeviceData1: DeviceData1, ACS_Time: Long,
    Payfone_Alias: String, TranStatusData: TranStatusData, Centurion_BIN_Class: String,
    BankData: BankData, DeviceData2: DeviceData2, ACS_Host: String,
    DeviceData3: DeviceData3, txn_status: String, Device_Type: String,
    TranOutcome: TranOutcome, AcsData: AcsData, DateTimeData: DateTimeData)
现在TranData、BillingAndShippingData、AcquisitionData和其他一些也是案例类。我认为这样做是为了绕过case类的21或22元素限制。如果你“展开”所有东西,总共有76个元素

我唯一的工作想法是将case类分解成数据帧,然后一次将它们连接在一起。这似乎有点繁重,我希望有一种方法可以“扁平化”RDD。我已经看过了,但没有看到任何明显的

附加注释

这就是我目前将东西转换为json的方式。 首先,我使用

def rddDistinctToTable(txnData: RDD[CCABINDeviceDataPartial], instanceSpark:SparkService,
    tableName: String): DataFrame = {

  import instanceSpark.sql.implicits._
  val fullTxns = txnData.filter(x => x.Tran_Id != "0")
  val uniqueTxns = rddToDataFrameHolder(fullTxns.distinct()).toDF()
  uniqueTxns.registerTempTable(tableName)
  return uniqueTxns

}
然后转换为json并使用

sparkStringJsonRDDFunctions(uniqueTxns.toJSON)
  .saveJsonToEs(instanceSpark.sc.getConf.get("es.resource"))

快速简单的解决方案:

  • 将RDD转换为数据帧
  • 使用
    select
    展平记录(您可以使用点访问嵌套对象,如
    df.select(“somecolumn.*”、“另一个.nested.column”)
  • 使用
    write.json
    作为json进行写入

无法更新到Scala 2.11。