如何更改与另一个数据帧报头中的数据帧的报头?(how to change header of a d

2019-11-04 11:24发布

我有一个数据集看起来像这样

LineItem.organizationId|^|LineItem.lineItemId|^|StatementTypeCode|^|LineItemName|^|LocalLanguageLabel|^|FinancialConceptLocal|^|FinancialConceptGlobal|^|IsDimensional|^|InstrumentId|^|LineItemSequence|^|PhysicalMeasureId|^|FinancialConceptCodeGlobalSecondary|^|IsRangeAllowed|^|IsSegmentedByOrigin|^|SegmentGroupDescription|^|SegmentChildDescription|^|SegmentChildLocalLanguageLabel|^|LocalLanguageLabel.languageId|^|LineItemName.languageId|^|SegmentChildDescription.languageId|^|SegmentChildLocalLanguageLabel.languageId|^|SegmentGroupDescription.languageId|^|SegmentMultipleFundbDescription|^|SegmentMultipleFundbDescription.languageId|^|IsCredit|^|FinancialConceptLocalId|^|FinancialConceptGlobalId|^|FinancialConceptCodeGlobalSecondaryId|^|FFAction|!|
Japan|^|1507101869432|^|4295876606|^|1|^|BAL|^|Cash And Deposits|^|null|^|null|^|ACAE|^|false|^|null|^|null|^|null|^|null|^|false|^|null|^|null|^|null|^|null|^|505126|^|505074|^|null|^|null|^|null|^|null|^|null|^|null|^|null|^|3018759|^|null|^|I|!|

这是自动发现模式如何加载数据

val df1With_ = df.toDF(df.columns.map(_.replace(".", "_")): _*)
val column_to_keep = df1With_.columns.filter(v => (!v.contains("^") && !v.contains("!") && !v.contains("_c"))).toSeq
val df1result = df1With_.select(column_to_keep.head, column_to_keep.tail: _*)

现在,我有我做连接操作,最后我创造出输出写入csv文件数据帧的另一个数据帧。

最终的数据帧看起来像这样

val dfMainOutputFinal = dfMainOutput.select($"DataPartition", $"StatementTypeCode",concat_ws("|^|", dfMainOutput.schema.fieldNames.filter(_ != "DataPartition").map(c => col(c)): _*).as("concatenated"))

val dfMainOutputFinalWithoutNull = dfMainOutputFinal.withColumn("concatenated", regexp_replace(col("concatenated"), "null", ""))

dfMainOutputFinalWithoutNull.write.partitionBy("DataPartition","StatementTypeCode")
  .format("csv")
  .option("nullValue", "")
  .option("header","true")
  .option("codec", "gzip")
  .save("output")

现在在我的输出文件,我看到我的头,因为只有concatenated预计。

现在的问题是反正是有改变我的最终输出的头作为头df1result数据帧

Answer 1:

我认为,要解决这将是重新命名的最简单的方式concatenated列。 由于列名已经在存在column_to_keep变量,你可以简单地做:

val header = column_to_keep.mkString("|^|")
val dfMainOutputFinalWithoutNull = dfMainOutputFinal
  .withColumn("concatenated", regexp_replace(col("concatenated"), "null", ""))
  .withColumnRenamed("concatenated", header)

这将导致是一个非常长的列名,因此,我不会劝告它,如果它是比保存到CSV别的东西。



文章来源: how to change header of a data frame with another data frame header?