我正在尝试将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来修复它,但是你不想这样做,因为有很多字段可能会有问题。我想以编程方式修复它,无论是在创建数据帧还是类...
时任何其他想法也请让我知道
答案 0 :(得分:1)
为了能够使用spark-csv
,您必须确保它可用。在交互模式下,最简单的解决方案是在启动shell时使用packages
参数:
bin/spark-shell --packages com.databricks:spark-csv_2.10:1.1.0
关于使用csv文件进行手动解析,特别是像cars.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)