晚上好
我正在制作一个应用程序,我在其中读取文件,并且在处理了数据之后,我有了一个带有信息的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
答案 0 :(得分:1)
我们可以使用 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")