如何使用JSON映射文件在Spark中使用Scala生成新的数据帧
我有两个如何使用JSON映射文件在Spark中使用Scala生成新的数据帧,json,scala,apache-spark,dataframe,apache-spark-sql,Json,Scala,Apache Spark,Dataframe,Apache Spark Sql,我有两个DataFrames、DF1和DF2,以及一个JSON文件,我需要将其用作创建另一个数据帧的映射文件(DF3) DF1: DF2: 除了这个映射文件之外,我还有一个JSON格式的映射文件,它将用于生成DF3 下面是JSON映射文件: {"targetColumn":"newColumn1","sourceField1":"column2","sourceField2":"column4"} {"targetColumn":"newColumn2","sourceField1":"colu
DataFrame
s、DF1
和DF2
,以及一个JSON文件,我需要将其用作创建另一个数据帧的映射文件(DF3
)
DF1:
DF2:
除了这个映射文件之外,我还有一个JSON格式的映射文件,它将用于生成DF3
下面是JSON映射文件:
{"targetColumn":"newColumn1","sourceField1":"column2","sourceField2":"column4"}
{"targetColumn":"newColumn2","sourceField1":"column7","sourceField2":"column5"}
{"targetColumn":"newColumn3","sourceField1":"column8","sourceField2":"column6"}
因此,从这个JSON文件中,我需要使用映射的targetColumn
部分中可用的列创建DF3
,它将检查源列是否存在于DF1中,然后从DF1
映射到sourceField1
,否则从DF2
映射到sourceField2
以下是预期产出
+----------+-----------+----------+
|newColumn1| newColumn2|newColumn3|
+----------+-----------+----------+
| John| New| xxx|
| Alex| Old| yyy|
| Divas|replacement| zzz|
| Jerry| New| ppp|
+----------+-----------+----------+
这里的任何帮助都将被占用 解析
JSON
并创建下面的自定义对象列表
case class SrcTgtMapping(targetColumn:String,sourceField1:String,sourceField2:String)
val srcTgtMappingList=List(SrcTgtMapping("newColumn1","column2","column4"),SrcTgtMapping("newColumn2","column7","column5"),SrcTgtMapping("newColumn3","column8","column6"))
将虚拟索引列
添加到两个数据帧
中,并基于索引列
import org.apache.spark.sql.functions._
val df1WithIndex=df1.withColumn("index",monotonicallyIncreasingId)
val df2WithIndex=df2.withColumn("index",monotonicallyIncreasingId)
val joinedDf=df1WithIndex.join(df2WithIndex,df1WithIndex.col("index")===df2WithIndex.col("index"))
创建查询
并执行它
val df1Columns=df1WithIndex.columns.toList
val df2Columns=df2WithIndex.columns.toList
val query=srcTgtMappingList.map(stm=>if(df1Columns.contains(stm.sourceField1)) joinedDf.col(stm.sourceField1).alias(stm.targetColumn) else joinedDf.col(stm.sourceField2).alias(stm.targetColumn))
val output=joinedDf.select(query:_*)
output.show
样本输出:
+----------+-----------+----------+
|newColumn1| newColumn2|newColumn3|
+----------+-----------+----------+
| John| New| xxx|
| Alex| Old| yyy|
| Jerry| New| ppp|
| Divas|replacement| zzz|
+----------+-----------+----------+
希望这种方法能帮助您您尝试过什么Divas?org.apache.spark.sql->来自_json+schema,全部构建in@Pavel你能举一个例子说明我如何在代码中实现这一点吗?因为我是sparkds.withColumn的新手(“my_json_column”,来自_json(col(“my_json_column”),validJsonSchema)@Pavel这不起作用。你能解释一下我的json专栏是什么吗?谢谢你提供了这个很棒的解决方案,但我的要求是用Scala而不是SparkSQl。所以你能帮我在这里只用Scala做同样的事情吗?嗨@DivasNikhra,我修改了我的dataframes only解决方案谢谢你提供这个解决方案。这正是我在寻找:)你能帮我解决这个问题吗?
val df1Columns=df1WithIndex.columns.toList
val df2Columns=df2WithIndex.columns.toList
val query=srcTgtMappingList.map(stm=>if(df1Columns.contains(stm.sourceField1)) joinedDf.col(stm.sourceField1).alias(stm.targetColumn) else joinedDf.col(stm.sourceField2).alias(stm.targetColumn))
val output=joinedDf.select(query:_*)
output.show
+----------+-----------+----------+
|newColumn1| newColumn2|newColumn3|
+----------+-----------+----------+
| John| New| xxx|
| Alex| Old| yyy|
| Jerry| New| ppp|
| Divas|replacement| zzz|
+----------+-----------+----------+