spark scala问题上传csv

时间:2015-07-30 15:49:16

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

我正在尝试将csv文件上传到tempTable中,以便我可以查询它并且我有两个问题。 第一:我尝试将csv上传到DataFrame,这个csv有一些空字段....而且我没有找到办法。我发现有人在另一篇帖子中发帖使用:

val df = sqlContext.read.format("com.databricks.spark.csv").option("header", "true").load("cars.csv")

但它给出了一个错误说"无法加载数据源类:com.databricks.spark.csv"

然后我上传了文件并将其作为文本文件阅读,标题为:

val sqlContext = new org.apache.spark.sql.SQLContext(sc);
import sqlContext.implicits._;
case class cars(id: Int, name: String, licence: String);
val carsDF = sc.textFile("../myTests/cars.csv").map(_.split(",")).map(p => cars( p(0).trim.toInt, p(1).trim, p(2).trim) ).toDF();
carsDF.registerTempTable("cars");
val dgp = sqlContext.sql("SELECT * FROM cars");
dgp.show()

给出错误,因为其中一个许可证字段为空...我在构建数据框但是没有工作时试图控制此问题。 我显然可以进入csv文件,但通过添加null来修复它,但是你不想这样做,因为有很多字段可能会有问题。我想以编程方式修复它,无论是在创建数据帧还是类...

任何其他想法也请让我知道

2 个答案:

答案 0 :(得分:1)

为了能够使用spark-csv,您必须确保它可用。在交互模式下,最简单的解决方案是在启动shell时使用packages参数:

bin/spark-shell --packages com.databricks:spark-csv_2.10:1.1.0

关于使用csv文件进行手动解析,特别是像cars.csv这样的格式错误,需要的工作远比简单地分割逗号要多得多。有些事情需要考虑:

  • 如何检测csv方言,包括字符串引用方法
  • 如何处理字符串中的引号和换行符
  • 如何处理格式错误的行

如果是示例文件,则必须至少:

  • 过滤空行
  • 读标题
  • 如果缺少字段,则将行映射到提供默认值的字段

答案 1 :(得分:0)

你走了。请记住检查CSV的分隔符。

// create spark session
val spark = org.apache.spark.sql.SparkSession.builder
        .master("local")
        .appName("Spark CSV Reader")
        .getOrCreate;

// read csv
val df = spark.read
         .format("csv")
         .option("header", "true") //reading the headers
         .option("mode", "DROPMALFORMED")
         .option("delimiter", ",")
         .load("/your/csv/dir/simplecsv.csv")

// create a table from dataframe
df.createOrReplaceTempView("tableName")
// run your sql query
val sqlResults = spark.sql("SELECT * FROM tableName")
// display sql results
display(sqlResults)