如何在Spark DataFrame中将多个float列合并为一个ArrayType(FloatType())?

时间:2019-02-26 01:21:13

标签: python scala apache-spark pyspark

在读取CSV文件后,我有一个火花DataFrame,其中有许多浮点列。

我想将所有浮点列合并为一个ArrayType(FloatType())

有任何想法如何使用PySpark(或Scala)做到这一点?

3 个答案:

答案 0 :(得分:2)

如果您知道所有的浮点列名称。您可以尝试这个(scala)

     d         e      f       g

0   NaN    NaN       NaN     NaN

答案 1 :(得分:1)

这是Scala中的另一个版本:

data.printSchema

root
 |-- Int_Col1: integer (nullable = false)
 |-- Str_Col1: string (nullable = true)
 |-- Float_Col1: float (nullable = false)
 |-- Float_Col2: float (nullable = false)
 |-- Str_Col2: string (nullable = true)
 |-- Float_Col3: float (nullable = false)

data.show()

+--------+--------+----------+----------+--------+----------+
|Int_Col1|Str_Col1|Float_Col1|Float_Col2|Str_Col2|Float_Col3|
+--------+--------+----------+----------+--------+----------+
|       1|     ABC|     10.99|     20.99|       a|      9.99|
|       2|     XYZ|  999.1343|    9858.1|       b|    488.99|
+--------+--------+----------+----------+--------+----------+

添加新的array<float>字段以连接所有float值。

val df = data.withColumn("Float_Arr_Col",array().cast("array<float>"))

然后过滤所需的数据类型,并使用foldLeft

连接浮点列
df.dtypes
.collect{ case (dn, dt) if dt.startsWith("FloatType") => dn }
.foldLeft(df)((accDF, c) => accDF.withColumn("Float_Arr_Col", 
                                             array_union(col("Float_Arr_Col"),array(col(c)))))
.show(false)

输出:

+--------+--------+----------+----------+--------+----------+--------------------------+
|Int_Col1|Str_Col1|Float_Col1|Float_Col2|Str_Col2|Float_Col3|Float_Arr_Col             |
+--------+--------+----------+----------+--------+----------+--------------------------+
|1       |ABC     |10.99     |20.99     |a       |9.99      |[10.99, 20.99, 9.99]      |
|2       |XYZ     |999.1343  |9858.1    |b       |488.99    |[999.1343, 9858.1, 488.99]|
+--------+--------+----------+----------+--------+----------+--------------------------+

希望这会有所帮助!

答案 2 :(得分:0)

找到了解决方案。非常简单,但是很难找到。

float_cols = ['_c1', '_c2', '_c3', '_c4', '_c5', '_c6', '_c7', '_c8', '_c9', '_c10']

df.withColumn('combined', array([col(c) for c in float_cols]))