在读取CSV文件后,我有一个火花DataFrame
,其中有许多浮点列。
我想将所有浮点列合并为一个ArrayType(FloatType())
。
有任何想法如何使用PySpark(或Scala)做到这一点?
答案 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]))