Как SparkSQL загрузить CSV с заголовком в инструкции FROM - PullRequest
0 голосов
/ 13 июня 2019

Для оператора 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 ]

2 голосов
/ 13 июня 2019

Если вы хотите сделать это простым SQL, сначала создайте таблицу или представление:

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

, а затем SELECT из него:

SELECT * FROM foo;

Чтобы использовать этот метод с SparkSession.sql, удалить трейлинг ; и выполнить каждый оператор отдельно.

1 голос
/ 13 июня 2019

Я не думаю, что в Spark 2.4.3 доступно чистое решение SQL, которое является последней версией при написании этого.Этот синтаксис анализируется с использованием правила ResolveSQLOnFile, которое всегда вызывает конструктор DataSource с пустой картой параметров .

Я могу проверитьчто установка точки останова на конструкторе DataSource и изменение options на Map("header" -> "true") делает трюк настолько очевидно, что именно здесь это должно быть реализовано.

enter image description here

enter image description here

0 голосов
/ 13 июня 2019

Вы можете попробовать это:

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|
+---+---+---+

Путь 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.createOrReplaceTempView("table")

scala> spark.sql("SELECT * FROM table").show
+---+---+---+
|  a|  b|  c|
+---+---+---+
|  1|  2|  3|
|  4|  5|  6|
+---+---+---+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...