AWS Athena вставить в именованные столбцы не работает в pyspark - PullRequest
1 голос
/ 03 октября 2019

Я создал небольшую тестовую таблицу, используя pyspark

query="""
CREATE EXTERNAL TABLE IF NOT EXISTS test1
(
c1 INT,
c2 INT,
c3 INT
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
LOCATION 's3://mybucket/myfolder/'
"""
spark.sql(query)

И это прекрасно работает, получая следующий вывод

spark.sql("select * from test1").show()

+---+---+---+
| c1| c2| c3|
+---+---+---+
|  1|  2|  3|
|  4|  5|  6|
+---+---+---+

Моя проблема сейчас пытается сделать вставку. Согласно моим прочтениям документации Athena, я должен быть в состоянии сделать следующее, но я получаю сообщение об ошибке

query="""
insert into test1(c1,c2,c3) select c1,c2,c3 from test1
"""
spark.sql(query)


"\nmismatched input 'c1' expecting {'(', 'SELECT', 'FROM', 'VALUES', 'TABLE', 'INSERT', 'MAP', 'REDUCE'}(line 2, pos 21)\n\n== SQL ==\n\ninsert into test1(c1,c2,c3) select c1,c2,c3 from test1\n---------------------^^^\n"
Traceback (most recent call last):
  File "/usr/lib/spark/python/lib/pyspark.zip/pyspark/sql/session.py", line 767, in sql
    return DataFrame(self._jsparkSession.sql(sqlQuery), self._wrapped)
  File "/usr/lib/spark/python/lib/py4j-0.10.7-src.zip/py4j/java_gateway.py", line 1257, in __call__
    answer, self.gateway_client, self.target_id, self.name)
  File "/usr/lib/spark/python/lib/pyspark.zip/pyspark/sql/utils.py", line 73, in deco
    raise ParseException(s.split(': ', 1)[1], stackTrace)
pyspark.sql.utils.ParseException: "\nmismatched input 'c1' expecting {'(', 'SELECT', 'FROM', 'VALUES', 'TABLE', 'INSERT', 'MAP', 'REDUCE'}(line 2, pos 21)\n\n== SQL ==\n\ninsert into test1(c1,c2,c3) select c1,c2,c3 from test1\n---------------------^^^\n"

Однако следующий INSERT работает должным образом

query="""
insert into test1 select c1,c2,c3 from test1
"""

spark.sql(query)

Есликто-нибудь может увидеть, что я делаю неправильно, это будет оценено

1 Ответ

0 голосов
/ 03 октября 2019

Согласно документации AWS, вам не нужно передавать имена столбцов вместе с таблицей назначения. Правильный запрос будет:

insert into test1 select c1,c2,c3 from test1

Ссылка: Афина вставить в документацию

...