Вот пример того, что я описал в комментариях .
. Вы можете использовать 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
в ваш выходной файл.