将Spark DataFrame架构转换为新架构

时间:2018-08-01 16:52:39

标签: scala apache-spark dataframe

我有多个spark作业,它们从不同的源读取数据,它们具有不同的架构,但是它们非常接近,我要做的就是将所有这些写入相同的Redshift表中,因此我需要统一所有DataFrame模式,最好的方法是什么?

让我们说第一个输入数据的模式如下:

file.findElementAt(editor.getCaretModel().getOffset())

seconf inout源代码的模式如下:

PsiTreeUtil.getParentOfType()

表架构(预期为Unify DataFrame):

  val schema1 = StructType(Seq(
    StructField("date", DateType),
    StructField("campaign_id", StringType),
    StructField("campaign_name", StringType),
    StructField("platform", StringType),
    StructField("country", StringType),
    StructField("views", DoubleType),
    StructField("installs", DoubleType),
    StructField("spend", DoubleType)
  ))

正如您在最终模式中看到的那样,我有一些列可能不在输入模式中,因此它应该为null,一些列名称也应该重命名。并且某些列,例如 val schema2 = StructType(Seq( StructField("date", DateType), StructField("creator_id", StringType), StructField("creator_name", StringType), StructField("platform", StringType), StructField("views", DoubleType), StructField("installs", DoubleType), StructField("spend", DoubleType), StructField("ecpm", DoubleType) )) 应该删除。

2 个答案:

答案 0 :(得分:0)

基于indexcolumns dataframes添加到joinindex两者中,以便进行一对一映射。之后,selectcolumns joined中您想要的dataframe

  1. 如果您有两个dataframes,如下所示

    // df1.show
    +-----+---+
    | name|age|
    +-----+---+
    |Alice| 25|
    |  Bob| 29|
    |  Tom| 26|
    +-----+---+
    
    //df2.show
    +--------+-------+
    |    city|country|
    +--------+-------+
    |   Delhi|  India|
    |New York|    USA|
    |  London|     UK|
    +--------+-------+
    
  2. 现在添加index columns并获得一对一映射

    import org.apache.spark.sql.functions._
    
    val df1Index=df1.withColumn("index1",monotonicallyIncreasingId)
    
    val df2Index=df2.withColumn("index2",monotonicallyIncreasingId)
    
    val joinedDf=df1Index.join(df2Index,df1Index("index1")===df2Index("index2"))
    
    //joinedDf
    
    +-----+---+------+--------+-------+------+
    | name|age|index1|    city|country|index2|
    +-----+---+------+--------+-------+------+
    |Alice| 25|     0|   Delhi|  India|     0|
    |  Bob| 29|     1|New York|    USA|     1|
    |  Tom| 26|     2|  London|     UK|     2|
    +-----+---+------+--------+-------+------+
    

现在您可以像下面这样写查询

val queryList=List(col("name"),col("age"),col("country"))
joinedDf.select(queryList:_*).show

//Output df
+-----+---+-------+
| name|age|country|
+-----+---+-------+
|Alice| 25|  India|
|  Bob| 29|    USA|
|  Tom| 26|     UK|
+-----+---+-------+

答案 1 :(得分:0)

不确定是否有实现此目的的全自动方法。如果您的模式是固定的并且不是特别复杂,则可以手动调整模式并 LNK2019 unresolved external symbol ___CxxFrameHandler3 referenced in function __unwindfunclet$?UmbraServerMain@@YGHPAUHINSTANCE__@@0PA_WH@Z$0 进行结果。

为了便于讨论,假设您要包含union中的列col1col2,并包含{{1}中的frame1col2 }。

col4

仅此而已。我们手动指定每列,因此我们可以跳过我们喜欢的任何列。