【问题标题】:how to change header of a data frame with another data frame header?如何用另一个数据帧头更改数据帧的头?
【发布时间】:2017-10-09 09:32:47
【问题描述】:

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

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 数据帧的标题

【问题讨论】:

    标签: scala apache-spark spark-dataframe spark-csv


    【解决方案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 之外的其他内容,我不会建议它。

    【讨论】:

    • 嗨 Shaido 如果我必须在最后一列 | 仅用于标题怎么办?
    • 所以我的标题最后一列应该看起来像这样FFAction|!|,但目前我越来越像FFAction|^|!
    • @SUDARSHAN 将 mkString("|^|") 更改为 mkString("", "|^|", "|")
    • @SUDARSHAN 试试这个,应该对你有用:val header = column_to_keep.dropRight(1).mkString("", "|^|", "|!|")
    • @SUDARSHAN 我看的第一本关于 Scala 的书是“不耐烦的 Scala”,如果您想学习语法并且已经了解一些 Java/C++,这很好。您还可以查看 Coursera 上的“Scala 中的函数式编程原理”课程。
    猜你喜欢
    • 2016-12-20
    • 1970-01-01
    • 1970-01-01
    • 2016-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-16
    相关资源
    最近更新 更多