2024-09-27 07:18:54 发布
网友
在读取CSV文件后,我有一个sparkDataFrame,其中有许多float列。在
DataFrame
我想把所有的float列组合成一个ArrayType(FloatType())。在
ArrayType(FloatType())
有什么办法用PySpark(或Scala)来做这个吗?在
如果你知道所有的浮点列名。你可以试试这个(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值。在
array<float>
float
然后过滤所需的数据类型并使用foldLeft连接浮点列
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]| + + + + + + + +
希望这有帮助!在
如果你知道所有的浮点列名。你可以试试这个(scala)
找到了解决办法。很简单,但是很难找到。在
下面是Scala中的另一个版本:
添加一个新的
^{pr2}$array<float>
字段来连接所有float
值。在然后过滤所需的数据类型并使用
foldLeft
连接浮点列输出:
希望这有帮助!在
相关问题 更多 >
编程相关推荐