我有多个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)
))
应该删除。
答案 0 :(得分:0)
基于index
将columns
dataframes
添加到join
和index
两者中,以便进行一对一映射。之后,select
仅columns
joined
中您想要的dataframe
。
如果您有两个dataframes
,如下所示
// df1.show
+-----+---+
| name|age|
+-----+---+
|Alice| 25|
| Bob| 29|
| Tom| 26|
+-----+---+
//df2.show
+--------+-------+
| city|country|
+--------+-------+
| Delhi| India|
|New York| USA|
| London| UK|
+--------+-------+
现在添加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
中的列col1
和col2
,并包含{{1}中的frame1
和col2
}。
col4
仅此而已。我们手动指定每列,因此我们可以跳过我们喜欢的任何列。