将固定宽度的文件读入Spark很容易,并且有多种方法可以这样做。但是,我找不到从spark(2.3.1)写入固定宽度输出的方法。将DF转换为RDD会有所帮助吗?当前正在使用Pyspark,但欢迎使用任何语言。有人可以建议出路吗?
答案 0 :(得分:2)
以下是我在comments中描述的示例。
您可以使用pyspark.sql.functions.format_string()
将每一列格式化为固定宽度,然后使用pyspark.sql.functions.concat()
将它们全部组合成一个字符串。
例如,假设您具有以下DataFrame:
data = [
(1, "one", "2016-01-01"),
(2, "two", "2016-02-01"),
(3, "three", "2016-03-01")
]
df = spark.createDataFrame(data, ["id", "value", "date"])
df.show()
#+---+-----+----------+
#| id|value| date|
#+---+-----+----------+
#| 1| one|2016-01-01|
#| 2| two|2016-02-01|
#| 3|three|2016-03-01|
#+---+-----+----------+
假设您要写出左对齐的固定宽度为10的数据
from pyspark.sql.functions import concat, format_string
fixed_width = 10
ljust = r"%-{width}s".format(width=fixed_width)
df.select(
concat(*[format_string(ljust,c) for c in df.columns]).alias("fixedWidth")
).show(truncate=False)
#+------------------------------+
#|fixedWidth |
#+------------------------------+
#|1 one 2016-01-01|
#|2 two 2016-02-01|
#|3 three 2016-03-01|
#+------------------------------+
这里,我们使用printf
的{{1}}样式格式将左对齐宽度指定为10。
如果您想对字符串进行右对齐,请删除负号:
%-10s
现在您只能将rjust = r"%{width}s".format(width=fixed_width)
df.select(
concat(*[format_string(rjust,c) for c in df.columns]).alias("fixedWidth")
).show(truncate=False)
#+------------------------------+
#|fixedWidth |
#+------------------------------+
#| 1 one2016-01-01|
#| 2 two2016-02-01|
#| 3 three2016-03-01|
#+------------------------------+
列写到输出文件中。