【问题标题】:renaming a Column in Data frame while flattening programatically Using selectExpr在以编程方式展平时重命名数据框中的列使用 selectExpr
【发布时间】:2018-01-10 16:05:26
【问题描述】:

我正在使用下面链接中的代码来展平嵌套数据框Flatten a DataFrame in Scala with different DataTypes inside .... 我收到以下错误:

线程“主”org.apache.spark.sql.AnalysisException 中的异常: 参考“alternateIdentificationQualifierCode”不明确,可以 是:alternateIdentificationQualifierCode#2, 替代识别限定符代码#11.; 在 org.apache.spark.sql.catalyst.plans.logical.LogicalPlan.resolve(LogicalPlan.scala:287) 在 org.apache.spark.sql.catalyst.plans.logical.LogicalPlan.resolveChildren(LogicalPlan.scala:171) 在 org.apache.spark.sql.catalyst.analysis.Analyzer$ResolveReferences$$anonfun$apply$10$$anonfun$applyOrElse$4$$anonfun$26.apply(Analyzer.scala:470) 在 org.apache.spark.sql.catalyst.analysis.Analyzer$ResolveReferences$$anonfun$apply$10$$anonfun$applyOrElse$4$$anonfun$26.apply(Analyzer.scala:470) 在 org.apache.spark.sql.catalyst.analysis.package$.withPosition(package.scala:48) 在 org.apache.spark.sql.catalyst.analysis.Analyzer$ResolveReferences$$anonfun$apply$10$$anonfun$applyOrElse$4.applyOrElse(Analyzer.scala:470) 在 org.apache.spark.sql.catalyst.analysis.Analyzer$ResolveReferences$$anonfun$apply$10$$anonfun$applyOrElse$4.applyOrElse(Analyzer.scala:466) 在 org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$transformUp$1.apply(TreeNode.scala:335) 在 org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$transformUp$1.apply(TreeNode.scala:335) 在 org.apache.spark.sql.catalyst.trees.CurrentOrigin$.withOrigin(TreeNode.scala:69) 在 org.apache.spark.sql.catalyst.trees.TreeNode.transformUp(TreeNode.scala:334) 在 org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$5.apply(TreeNode.scala:332) 在 org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$5.apply(TreeNode.scala:332) 在 org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$4.apply(TreeNode.scala:281) 在 scala.collection.Iterator$$anon$11.next(Iterator.scala:328)

有什么方法可以在 scala 的 spark-dataframes 中以编程方式即时重命名列,谢谢。 \

代码:

object flatten {

  def main(args: Array[String]) {

    if (args.length < 1) {
      System.err.println("Usage: XMLParser.jar <config.properties>")
      println("Please provide the Configuration File for the XML Parser Job")
      System.exit(1)
    }

    val sc = new SparkContext(new SparkConf().setAppName("Spark XML Process"))
    val sqlContext = new HiveContext(sc)
    val prop = new Properties()
    prop.load(new FileInputStream(args(0)))
    val dfSchema = sqlContext.read.format("com.databricks.spark.xml").option("rowTag",prop.getProperty("xmltag")).load(prop.getProperty("input"))
    val flattened_DataFrame=flattenDf(dfSchema)

   // flattened_DataFrame.printSchema()

  }

【问题讨论】:

  • 你试过用ColumnRenamed api吗?
  • 您是否可以提供任何有用的示例,我只需要动态重命名列,每次都会不断变化
  • 列数是固定的吗?
  • no.. 如果您实际查看该链接中的代码,它会像这样迭代数组中的每个元素
  • val 字段 = df.schema.fields

标签: scala spark-dataframe


【解决方案1】:

使用

val renamed_df = df.toDF(Seq("col1","col2","col3"))

重命名列

【讨论】:

  • 我不会提前知道列,我正在动态接收数据框,所以在循环中我必须使用一些命名约定动态重命名列
  • 您可以使用“val colNames = df.columns”将列名作为数组获取。也许你可以用它来查找重复项并重命名它们。
  • 只有在展平结构时才会知道列名
猜你喜欢
  • 2018-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 2014-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多