選擇專欄中,我要實現以下的事情
比如我的Emp文件的(2個文件) 我只需要選擇2例如EMPID和EmpName列,如果文件不具有EmpName它應選擇EMPID數據幀星火數據框中使用情況
1)Emp1.csv(文件)
Empid EmpName Dept
1 ABC IS
2 XYZ COE
2)Emp.csv(文件)
Empid EmpName
1 ABC
2 XYZ
0的一列
代碼試圖到目前爲止
scala> val SourceData = spark.read.format("com.databricks.spark.csv").option("inferSchema", "true").option("delimiter", ",").option("header", "true").load("/root/Empfiles/")
SourceData: org.apache.spark.sql.DataFrame = [Empid: string, EmpName: string ... 1 more field]
scala> SourceData.printSchema
root
|-- Empid: string (nullable = true)
|-- EmpName: string (nullable = true)
|-- Dept: string (nullable = true)
如果指定文件
scala> var FormatedColumn = SourceData.select(
| SourceData.columns.map {
| case "Empid" => SourceData("Empid").cast(IntegerType).as("empid")
| case "EmpName" => SourceData("EmpName").cast(StringType).as("empname")
| case "Dept" => SourceData("Dept").cast(StringType).as("dept")
| }: _*
|)
FormatedColumn: org.apache.spark.sql.DataFrame = [empid: int, empname: string ... 1 more field]
的所有列名,但我想只有特定的兩列失敗(如果列可顯示它選擇與此代碼工作更改數據類型和列名稱)
scala> var FormatedColumn = SourceData.select(
| SourceData.columns.map {
| case "Empid" => SourceData("Empid").cast(IntegerType).as("empid")
| case "EmpName" => SourceData("EmpName").cast(StringType).as("empname")
| }: _*
|)
scala.MatchError: Dept (of class java.lang.String)
at $anonfun$1.apply(<console>:32)
at $anonfun$1.apply(<console>:32)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234)
at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33)
at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:186)
at scala.collection.TraversableLike$class.map(TraversableLike.scala:234)
at scala.collection.mutable.ArrayOps$ofRef.map(ArrayOps.scala:186)
... 53 elided
它拋出一個MatchError,因爲它無法在您的映射函數中找到匹配的大小寫。如果您添加一個默認情況下它應該成功。您也可以首先在「Empid」和「EmpName」上運行選擇,然後格式化後續列。 –
對不起,我是新來的默認情況下,斯卡拉我不想做任何事,所以我應該寫什麼? – Bhavesh