无法过滤Spark 2.2.0中存储在数据框中的CSV列

时间:2019-07-08 17:45:56

标签: scala apache-spark apache-spark-sql

我正在使用Spark和Scala从本地计算机读取CSV文件并将其存储到数据帧(称为df)中。我只需要从df中选择带有新别名的选定列,然后将其保存到新数据框newDf中。我试图做同样的事情,但是下面出现错误。

main" org.apache.spark.sql.AnalysisException: cannot resolve '`history_temp.time`' given input columns: [history_temp.time, history_temp.poc]

下面是编写从本地计算机读取csv文件的代码。

import org.apache.spark.sql.SparkSession

object DataLoadConversion {


  def main(args: Array[String]): Unit = {

    System.setProperty("spark.sql.warehouse.dir", "file:///C:/spark-warehouse")
    val spark = SparkSession.builder().master("local").appName("DataConversion").getOrCreate()

    val df = spark.read.format("com.databricks.spark.csv")
      .option("quote", "\"")
      .option("escape", "\"")
      .option("delimiter", ",")
      .option("header", "true")
      .option("mode", "FAILFAST")
      .option("inferSchema","true")
      .load("file:///C:/Users/an/Desktop/ct_temp.csv")

    df.show(5)   // Till this code is working fine

    val newDf = df.select("history_temp.time","history_temp.poc")

下面是我尝试但不起作用的代码。

//  val newDf = df.select($"history_temp.time",$"history_temp.poc")
//  val newDf = df.select("history_temp.time","history_temp.poc")
//  val newDf = df.select( df("history_temp.time").as("TIME"))
//  val newDf = df.select(df.col("history_temp.time"))

//  df.select(df.col("*"))    // This is working

    newDf.show(10)
  }
}

1 个答案:

答案 0 :(得分:2)

从它的外观。您的列名格式是这里的问题。我猜他们只是普通的stringType,但是当您有诸如history_temp.time之类的内容时,spark会认为它是一个数组列。事实并非如此。我将重命名所有列并替换为“。”到“ ”。那么您可以运行相同的选择,它应该可以工作。您可以使用foldleft放置所有“”。如下所示。

val replacedDF = df.columns.foldleft(df){ (newdf, colname)=>
newdf.withColumnRenamed (colname, colname.replace(".","_"))
}

完成后,您可以从以下替换的DF中选择

val newDf= replacedDf.select("history_temp_time","history_temp_poc")

让我知道如何为您工作。