我有三个数据帧存储在列表data_multi
中。这些数据帧中的每一个都具有相同的列名称和相同的dtypes
列
>>> set(data_multi[0].columns) == set(data_multi[1].columns) == set(data_multi[2].columns)
True
dtypes(仅显示一列)
>>> data_multi[0].select('aml_id_key_12739').dtypes
[('aml_id_key_12739', 'bigint')]
>>> data_multi[1].select('aml_id_key_12739').dtypes
[('aml_id_key_12739', 'bigint')]
>>> data_multi[2].select('aml_id_key_12739').dtypes
[('aml_id_key_12739', 'bigint')]
我复制了一篇关于SO的帖子中提到的函数,即联合(rbinds)所有数据帧
def unionAll(*dfs):
return reduce(DataFrame.unionAll, dfs)
使用这个,我将三个数据帧合并为一个数据帧 data_single = unionAll(* ddata_multi)
这是我遇到问题的地方。每个数据框中的aml_id_key_12739
列都是'bigint'
,但在联合之后,它变为'double'
>>> pprint(data_single.select('aml_id_key_12739').dtypes)
[('aml_id_key_12739', 'double')]
因此我的整个id列都搞砸了。我在俯瞰什么?
答案 0 :(得分:0)
我发现了这个错误。问题是spark只会附加数据帧。它不会通过使用列名追加。
如果您正在使用union,那么您应该确保数据框中的列以相同的顺序出现,因为附加似乎按它们出现的顺序发生。
在这个例子中,我颠倒了列的顺序和第二个数据帧(df_2
)中的值,然后取了一个联合。
>>> df_1 = spark.createDataFrame([['a',1]], ['col_1', 'col_2'])
>>> df_2 = spark.createDataFrame([[2,'b']], ['col_2', 'col_1'])
>>> df_3 = unionAll(*[df_1, df_2])
>>> df_3
DataFrame[col_1: string, col_2: string]
>>> df_3.show()
+-----+-----+
|col_1|col_2|
+-----+-----+
| a| 1|
| 2| b|
+-----+-----+
现在,当我使用正确的订单时,我得到了预期的输出
>>> df_3 = unionAll(*[df_1.select(*['col_1', 'col_2']), df_2.select(*['col_1', 'col_2'])])
>>> df_3.show()
+-----+-----+
|col_1|col_2|
+-----+-----+
| a| 1|
| b| 2|
+-----+-----+