创建固定宽度的文本文件

时间:2020-03-26 03:11:10

标签: scala apache-spark

晚上好

我正在制作一个应用程序,我在其中读取文件,并且在处理了数据之后,我有了一个带有信息的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 个答案:

答案 0 :(得分:1)

我们可以使用 lpad rpad 函数生成固定宽度的数据帧,并在将数据帧写入HDFS时保持headerfalse

示例:

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")