apache-spark - Spark写入输出为固定宽度
问题描述
将固定宽度的文件读入 Spark 很容易,并且有多种方法可以做到这一点。但是,我找不到从 spark (2.3.1) 写入固定宽度输出的方法。将 DF 转换为 RDD 有帮助吗?目前使用 Pyspark,但欢迎使用任何语言。有人可以建议出路吗?
解决方案
这是我在评论中描述的一个例子。
您可以使用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
样式格式%-10s
来指定左对齐宽度 10。
相反,如果您想右对齐字符串,请删除负号:
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|
#+------------------------------+
现在您可以只将fixedWidth
列写入输出文件。
推荐阅读
- python - Format output of re.findall()
- node.js - IPFS 中两个节点之间的 Pubsub
- spring - Spring Boot 2.1.1.RELEASE 的 *autoconfigure.security.oauth2 和 *security.oauth2 类的类比是什么?
- c++ - 创建随机邻接矩阵,每个节点的最小度数为“k”
- f# - F# 加载程序集时出现问题:“无法加载一种或多种请求的类型”
- python-3.x - 如何在 PyQt5 中删除 QGroupBox 中的所有小部件?
- python - 如何使用 RegistryManager 创建和 EdgeDevice
- python - 如何从 Flask Web 服务器中运行 Python 程序?
- javascript - 将两个字符串解析为浮点值时如何保持零
- flow - 为什么我的节点返回一个 websocket 错误?