我正在使用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)
}
}
答案 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")
让我知道如何为您工作。