在spark DataFrame中,如何将几个float列合并到一个ArrayType(FloatType())中?

2024-09-27 07:18:54 发布

您现在位置:Python中文网/ 问答频道 /正文

在读取CSV文件后,我有一个sparkDataFrame,其中有许多float列。在

我想把所有的float列组合成一个ArrayType(FloatType())。在

有什么办法用PySpark(或Scala)来做这个吗?在


Tags: 文件csvfloatpysparkscala办法sparkdataframefloattype
3条回答

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

val names = Seq("float_col1", "float_col2","float_col3"...."float_col10");
df.withColumn("combined", array(names.map(frame(_)):_*))

找到了解决办法。很简单,但是很难找到。在

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

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

下面是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值。在

^{pr2}$

然后过滤所需的数据类型并使用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]|
+    +    +     +     +    +     +             +

希望这有帮助!在

相关问题 更多 >

    热门问题