最近在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)
答案 0 :(得分:0)
在spark中,并不会对列的元数据进行联合,并且不会像您认为的那样对数据进行混洗。宁可在列号上进行合并,如要进行合并,则两个Df的列数必须相同。.在进行合并之前,您必须考虑列的位置。与SQL或Oracle或其他RDBMS不同,spark中的基础文件是物理文件。希望能回答您的问题
答案 1 :(得分:0)
Spark联合是根据标准SQL实现的,因此可以按位置解析列。 API documentation也声明了这一点:
返回一个新的DataFrame,其中包含此框架和另一个框架中行的并集。
这等效于SQL中的UNION ALL。要执行SQL样式的集合并集(可对元素进行重复数据删除),请使用此函数,后跟一个单独的
。此功能也是SQL的标准功能,它按位置(而不是名称)解析列。