Spark Union列顺序

时间:2019-07-08 20:20:24

标签: apache-spark pyspark apache-spark-sql pyspark-sql

最近在Spark中遇到了一些奇怪的事情。据我了解,考虑到Spark dfs基于列的存储方法,列的顺序确实没有任何意义,它们就像字典中的键。

在df.union(df2)期间,列的顺序重要吗?我本以为不应该这样做,但是根据sql论坛的智慧,它确实可以。

所以我们有df1

df1
|  a|   b|
+---+----+
|  1| asd|
|  2|asda|
|  3| f1f|
+---+----+

df2
|   b|  a|
+----+---+
| asd|  1|
|asda|  2|
| f1f|  3|
+----+---+

result
|   a|   b|
+----+----+
|   1| asd|
|   2|asda|
|   3| f1f|
| asd|   1|
|asda|   2|
| f1f|   3|
+----+----+

似乎使用了df1中的架构,但是数据似乎按照其原始数据帧的顺序进行了合并。 显然,解决方案是执行df1.union(df2.select(df1.columns))

但是主要问题是,为什么要这样做?仅仅是因为它是pyspark.sql的一部分,还是我已经了解了Spark中的一些基础数据体系结构?

用于创建测试集的代码,如果有人想尝试

d1={'a':[1,2,3], 'b':['asd','asda','f1f']}
d2={ 'b':['asd','asda','f1f'], 'a':[1,2,3],}
pdf1=pd.DataFrame(d1)
pdf2=pd.DataFrame(d2)
df1=spark.createDataFrame(pdf1)
df2=spark.createDataFrame(pdf2)
test=df1.union(df2)

2 个答案:

答案 0 :(得分:0)

在spark中,并不会对列的元数据进行联合,并且不会像您认为的那样对数据进行混洗。宁可在列号上进行合并,如要进行合并,则两个Df的列数必须相同。.在进行合并之前,您必须考虑列的位置。与SQL或Oracle或其他RDBMS不同,spark中的基础文件是物理文件。希望能回答您的问题

答案 1 :(得分:0)

Spark联合是根据标准SQL实现的,因此可以按位置解析列。 API documentation也声明了这一点:

  

返回一个新的DataFrame,其中包含此框架和另一个框架中行的并集。

     

这等效于SQL中的UNION ALL。要执行SQL样式的集合并集(可对元素进行重复数据删除),请使用此函数,后跟一个单独的

。      

此功能也是SQL的标准功能,它按位置(而不是名称)解析列。