如何使用FROM语句中的标头使用SparkSQL加载csv

时间:2019-06-13 03:06:54

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

Spark SQL FROM语句可以指定文件路径和格式。
但是,加载csv时会忽略标头。
可以使用标题作为列名吗?

~ > cat test.csv
a,b,c
1,2,3
4,5,6
scala> spark.sql("SELECT * FROM csv.`test.csv`").show()
19/06/12 23:44:40 WARN ObjectStore: Failed to get database csv, returning NoSuchObjectException
+---+---+---+
|_c0|_c1|_c2|
+---+---+---+
|  a|  b|  c|
|  1|  2|  3|
|  4|  5|  6|
+---+---+---+

我想要。

+---+---+---+
|  a|  b|  c|
+---+---+---+
|  1|  2|  3|
|  4|  5|  6|
+---+---+---+

3 个答案:

答案 0 :(得分:2)

如果要使用普通SQL进行操作,则应首先创建表或视图:

CREATE TEMPORARY VIEW foo
USING csv 
OPTIONS (
  path 'test.csv',
  header true
);

,然后从其中SELECT

SELECT * FROM foo;

要将此方法与SparkSession.sql一起使用,请删除结尾的;并分别执行每个语句。

答案 1 :(得分:1)

我认为Spark 2.4.3中没有纯SQL解决方案,这是编写本文时的最新版本。使用规则ResolveSQLOnFile解析此语法,该规则始终使用DataSource调用an empty options map构造函数。

我可以验证在DataSource构造函数上设置断点并将options修改为Map("header" -> "true")确实可以解决问题,所以很明显,这是应该实现的地方。

enter image description here

enter image description here

答案 2 :(得分:0)

您可以尝试以下方法:

TooManyRequestsException

SQL方式如下:

scala> val df = spark.read.format("csv").option("header", "true").load("test.csv")
df: org.apache.spark.sql.DataFrame = [a: string, b: string ... 1 more field]

scala> df.show
+---+---+---+
|  a|  b|  c|
+---+---+---+
|  1|  2|  3|
|  4|  5|  6|
+---+---+---+