如何在Spark中写出数组文件?

时间:2018-08-23 20:49:07

标签: apache-spark pyspark apache-spark-sql

假设我有一个看起来像这样的DataFrame df

+--------------------+
|            features|
+--------------------+
|[9.409448, 0.0, 0.3]|
|[9.055118, 2.0, 0.3]|
|[9.055118, 2.9, 0.2]|
+--------------------+

它有1列称为“功能”,是浮点数数组。

我如何将其写到如下所示的csv文件中?

9.409448, 0.0, 0.3
9.055118, 2.0, 0.3
9.055118, 2.9, 0.2

我尝试过的事情:

  • 使用DataFrameWriter写入数据框-但它抱怨以csv的形式编写无法处理数组。
  • 可能爆炸并旋转,因此DataFrame具有3列,每个列对应一个。但这感觉效率很低,尤其是当我有更多列时。

想法:也许以某种方式将其转换为矩阵?我不确定该怎么做。

1 个答案:

答案 0 :(得分:1)

假设您的架构类似于:

df.printSchema()
#root
# |-- features: array (nullable = true)
# |    |-- element: double (containsNull = true)

一个想法是将浮点数数组转换为字符串数组。然后,您可以调用pyspark.sql.functions.concat_ws将数组内部的元素(现在为字符串)提取为一个字符串。

例如,使用", "作为分隔符:

import pyspark.sql.functions as f

df = df.select(
    f.concat_ws(", ", f.col("features").cast("array<string>")).alias("features")
)
df.show(truncate=False)
#+------------------+
#|features          |
#+------------------+
#|9.409448, 0.0, 0.3|
#|9.055118, 2.0, 0.3|
#|9.055118, 2.9, 0.2|
#+------------------+

从模式中可以看到,features列中现在只有一个字符串:

df.printSchema()
#root
# |-- features: string (nullable = false)

更新

使用pyspark.sql.DataFrameWriter.csv写入csv时,如果分隔符作为值的一部分出现,则默认行为是引用值。要关闭引号,请在写入文件时将quote选项设置为空字符串。