PySpark:执行联合中的列 dtype 更改 [重复]

Posted

技术标签:

【中文标题】PySpark:执行联合中的列 dtype 更改 [重复]【英文标题】:PySpark: column dtype changes in performing union [duplicate] 【发布时间】:2018-06-01 08:32:35 【问题描述】:

我在列表data_multi 中存储了三个数据帧。这些数据帧中的每一个都具有相同的列名和相同的数据类型

>>> 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 列都搞砸了。我在看什么?

【问题讨论】:

所有数据框中的列顺序是否相同? @Rumoku 我才意识到 【参考方案1】:

我发现了错误。问题是 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|
+-----+-----+

【讨论】:

以上是关于PySpark:执行联合中的列 dtype 更改 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

PySpark:如何删除 DataFrame 中的非数字列?

如何更改pyspark中的列元数据?

更改 DataFrame 中的列数据类型并将其传递到 UDF - PySpark

遍历 pyspark 数据框中的列,而不为单个列创建不同的数据框

加入后替换pyspark数据框中的列

拆分pyspark中的列