【发布时间】:2017-08-11 03:25:09
【问题描述】:
我想实现以下内容
例如我有 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
代码尝试到现在
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]
但我只想要特定的 2 列它会失败(如果列可用,它会显示选择并更改数据类型和列名)
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,因为它在你的 map 函数中找不到匹配的大小写。如果您添加默认情况,它应该会成功。您也可以先在“Empid”和“EmpName”上运行选择,然后格式化列。
-
对不起,我是 scala 的新手,默认情况下我不想做任何事情,所以我应该写什么?
标签: scala apache-spark dataframe apache-spark-sql spark-dataframe