Scala “解组”;“展平”;,是其他案例类的组合的案例类
一般来说,我想要达到的目标是: 我想我想从RDD中删除case类,但保留RDD,我不确定如何做到这一点 具体地说,我想做的是: 我试图实现的是将RDD的每一行转换为json。但是json只能是一个包含key:value对的列表。当我把它转换成json的当前形式时,我得到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"}
{"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”)
- 使用
作为json进行写入write.json