Создать текстовый файл с фиксированной шириной - PullRequest
0 голосов
/ 26 марта 2020

Добрый вечер

Я делаю приложение, в котором я читаю файл, и после обработки данных у меня есть DataFrame с информацией, и вывод программы должен быть текстовым файлом с фиксированной шириной с данными, которые находится в этом DataFrame.

таким образом будет выглядеть макет.

Полужирным шрифтом указаны значения, которые должны быть заменены, этот макет фиксируется только при изменении значений

01 DATA DO RECEBIMENTO...... :  **24/01/2011**
01 DATA DO PROCESSAMENTO... :   **27/01/2011**
01 PERIODO DA REMESSA...... :   **17/01/2011 A 23/01/2011**
01 TIPO DE REMESSA......... :   **RN**
01
01
01 A) REGISTROS DE CARROS.................................................................................................     **4.963**
01
01 B) REGISTROS DE MOTOS...............................................................................................        **88**
01
01 C) REGISTROS DE MULTAS.................................................................................................     4.875
01
01 D) TIPOS DE MULTAS...................................................................................................       377
01      A................................       157
01      B................................       199

Кто-нибудь знает, как лучше всего сгенерировать текстовый файл с фиксированной шириной, используя данные в этом DataFrame.

Мне нужно создать файл в этом макете, потому что я отправлю эту информацию в MainFrame

1 Ответ

1 голос
/ 26 марта 2020

Мы можем использовать функции lpad или rpad для генерации кадра данных фиксированной ширины и при записи кадра данных в HDFS сохраняем header как false.

Пример:

import org.apache.spark.sql.functions._

df.show()
//+---+---+---+
//|  i|  j|  k|
//+---+---+---+
//|  1|  a|  b|
//|  2|  c|  d|
//+---+---+---+

//length of each field
val len_fixed_width= 10

//on all columns doing lpad and then concat all columns at the end
val df2=df.columns.foldLeft(df){ (tempdf, colName) =>
  tempdf.withColumn(colName, lpad(col(s"${colName}"),len_fixed_width," "))
}.selectExpr("concat(*) fixedwidth")

df2.show(false)

//+------------------------------+
//|fixedwidth                    |
//+------------------------------+
//|         1         a         b|
//|         2         c         d|
//+------------------------------+

//for rpad
val df3=df.columns.foldLeft(df){ (tempdf, colName) =>
  tempdf.withColumn(colName, rpad(col(s"${colName}"),len_fixed_width," "))
}.selectExpr("concat(*) fixedwidth")

df3.show(false)
//+------------------------------+
//|fixedwidth                    |
//+------------------------------+
//|1         a         b         |
//|2         c         d         |
//+------------------------------+

//writing to filesystem(HDFS,s3..etc)
df3.write.option("header","false").csv("hdfs_path")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...