PySpark:执行联合中的列 dtype 更改



我有三个数据帧存储在一个列表data_multi中。其中每个数据帧都具有相同的列名和相同的 dtype

>>> set(data_multi[0].columns) == set(data_multi[1].columns)  == set(data_multi[2].columns)
True

dtype(仅显示一列(

>>> 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 = 联合全部(*ddata_multi(

这就是我面临问题的地方。每个数据帧中的aml_id_key_12739列是一个'bigint'但在并集之后,它立即成为'double'

>>> pprint(data_single.select('aml_id_key_12739').dtypes)
[('aml_id_key_12739', 'double')]

正因为如此,我的整个id列都搞砸了。我忽略了什么?

我发现了这个错误。问题是 Spark 将简单地附加数据帧。它不会使用列名称进行追加。

如果使用联合,则应确保数据框中的列按相同的顺序显示,因为追加似乎按其出现的顺序发生。

在这个例子中,我颠倒了列的顺序和第二个数据帧(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|
+-----+-----+

相关内容

最新更新