我们如何在 Spark 中使用 Dataframes(由 structtype 方法创建)合并具有不同列数的 2 个表?

Posted

技术标签:

【中文标题】我们如何在 Spark 中使用 Dataframes(由 structtype 方法创建)合并具有不同列数的 2 个表?【英文标题】:How can we UnionAll 2 tables that have different number of columns using Dataframes (created by structtype method) in Spark? 【发布时间】:2016-11-15 09:34:37 【问题描述】:

我有 2 个使用 Spark 中的 StructType 方法创建的数据帧。 它们都有不相等的列数。 需要联合他们。请协助。

【问题讨论】:

【参考方案1】:

除非您添加虚拟列,否则使用 Spark Dataframes 是不可能的

DataFrame UninonAll 就像您需要的所有 SQL 联合 具有相同数量的列和相同的数据类型...

union all 基本要求是类型,RDBMS sql 或 DataFrames 中的顺序应相同。

这意味着它们返回相同数量的列并且对应的列具有兼容的数据类型

因此您可以创建相同名称/类型的虚拟列以符合联合要求。

unionAll public DataFrame unionAll(DataFrame other)

返回一个新的 DataFrame,其中包含此帧中的行并集,并且 另一个框架。这相当于 SQL 中的 UNION ALL。

参数:

其他 - (未记录)

返回:

(未记录)

自:

1.3.0


SQL 示例:

案例 1:

** 可能:其中 a(int datatype),b(int datatype),c(int datatype) & x(int datatype), y(int datatype),z(int datatype) 是相同的数据类型 **

select a, b, c from table1 
unionall
select x,y,z from table2 

案例 2:

** 不可能 : where a(int type),b(int type),c(int type) & p(int type),q(int type),r(int type), x(String type) , y(int type),z(String type) **

select a, b, c from table1 
 unionall
select p, q,r, x,y,z from table2 

案例 3:

为使您可以在表 1 中添加虚拟列 x(String 类型), y(int 类型),z(String 类型)

在这种情况下,我将虚拟列“dasarathy”添加为 x,2 添加为 y,“dr”添加为 z

 select a, b, c, "dasarathy" as x, 2 as y, "dr" as z from table1 
     unionall
    select p, q,r, x,y,z from table2 

在数据帧的情况下也是如此。

结论:如果绝对需要,您可以将虚拟列(使用withColumn)添加到数据帧以使数据帧1 unionall数据帧2

【讨论】:

我的回答有用吗? 没有。答案更笼统。 我还没有看到你的消息,因为你还没有添加@myname,所以请从现在开始。我添加了 sql 示例以供您理解,这些示例在 Dataframes 中也类似。希望你现在明白了。 另外,如果您需要更多示例,您需要评论和交流。这是个好习惯。以便用户回复更多信息。如果您保持安静,用户将没有动力回答您的问题。如果您有任何问题,请随时提出问题。 感谢@Ram 的解释

以上是关于我们如何在 Spark 中使用 Dataframes(由 structtype 方法创建)合并具有不同列数的 2 个表?的主要内容,如果未能解决你的问题,请参考以下文章

如何打印 spark dataframe

Spark使用DataFrame读取复杂JSON中的嵌套数组

如何从 RDD 创建 Spark 数据集

如何在 Spark 中将两个 DataFrame 与组合列连接起来?

Apache Spark:如何使用 Java 在 dataFrame 中的空值列中插入数据

连接 Apache Spark DataFrame 中的列