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|
+---+---+---+
答案 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")
确实可以解决问题,所以很明显,这是应该实现的地方。
答案 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|
+---+---+---+