Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.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
如何使用JSON映射文件在Spark中使用Scala生成新的数据帧_Json_Scala_Apache Spark_Dataframe_Apache Spark Sql - Fatal编程技术网

如何使用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|
+----------+-----------+----------+