取消组合,“展平”一个案例类,它是其他案例类的组合

时间:2016-07-06 19:44:26

标签: scala apache-spark

一般来说我想要实现的目标: 我想我想从RDD中删除案例类,但保留RDD,我不确定如何做到这一点。

具体说明我要做的事情: 我想要实现的是将RDD的每一行转换为json。但是json只能是一个关键列表:值对。当我把它变成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"
 ...
}

我有一个我称之为父案例类的内容,如下所示:

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,AcquirerData和其他一些也是案例类。我认为这是为了绕过案例类的21或22元素限制。如果您“展开”所有内容,则总共有76个元素。

我唯一的工作思路是将案例类分解为数据框,然后将它们一次加入一个。这似乎有点繁琐,我希望有一种方法可以“压扁”RDD。我看过API documentation for RDDs,但看不到任何明显的东西。

附加说明

这就是我目前将内容转换为json的方式。 首先,我将RDD转换为带有

的数据帧
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并使用

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

1 个答案:

答案 0 :(得分:2)

快速简单的解决方案:

  • 将RDD转换为DataFrame
  • 使用<ul> <li ng-repeat="album in albums' "> <input type="checkbox" ng-show="display[$index]" ng-click="changed($index)"> {{album.name}} </input> </li> </ul> 展平记录(您可以使用点来访问select等嵌套对象)
  • 使用df.select("somecolumn.*", "another.nested.column")写为JSON