#apache-spark #apache-spark-sql
#apache-spark #apache-spark-sql
Вопрос:
Читая документы Datastax о поддерживаемом синтаксисе Spark SQL, я заметил, что вы можете использовать INSERT
инструкции, как обычно:
INSERT INTO hello (someId,name) VALUES (1,"hello")
Тестирование этого в среде Spark 2.0 (Python) и подключение к базе данных Mysql выдает ошибку:
File "/home/yawn/spark-2.0.0-bin-hadoop2.7/python/lib/pyspark.zip/pyspark/sql/utils.py", line 73, in deco
pyspark.sql.utils.ParseException:
u'nmismatched input 'someId' expecting {'(', 'SELECT', 'FROM', 'VALUES', 'TABLE', 'INSERT', 'MAP', 'REDUCE'}(line 1, pos 19)nn== SQL ==nINSERT INTO hello (someId,name) VALUES (1,"hello")n-------------------^^^n'
Однако, если я удалю явное определение столбца, оно будет работать так, как ожидалось:
INSERT INTO hello VALUES (1,"hello")
Я что-то упускаю?
Комментарии:
1. Насколько я знаю, spark sql основан на синтаксисе Hive SQL, а в руководстве по языку DML для hive говорится , что «Значения должны быть предоставлены для каждого столбца в таблице. Стандартный синтаксис SQL, который позволяет пользователю вставлять значения только в некоторые столбцы, пока не поддерживается. Для имитации стандартного SQL могут быть предоставлены нули для столбцов, которым пользователь не желает присваивать значение.» поэтому, вероятно, не имеет смысла предоставлять столбцы с точки зрения spark sql.
2. @VladoDemcak ну, для меня это имеет смысл с точки зрения удобочитаемости, независимо от того, необходимо ли указывать значение для каждого столбца. В любом случае, означает ли это, что в документах Datastax неуместна эта конкретная информация?
3. Вероятно, документы Datastax неуместны — в документации databricks говорится, что только это возможно
4. @VladoDemcak Спасибо
5. У меня та же проблема, я хочу сделать «INSERT INTO travelTable (ClientID,SendID,SubscriberKey,EmailAddress,SubscriberID,ListID,EventType,BounceCategory,SMTPCode,BounceReason,BatchID,TriggeredSendExternalKey,EventDateTimestamp,EventDate ) ЗНАЧЕНИЯ (‘7247942′,’536075′,’000060008489′,’olgaturdikulova@icloud.com’,’53911595′,’318′,’ Отказ’, ‘Мягкий отказ’, ‘450’, ‘Почтовый ящик заполнен’, ‘386’, ‘Нет’,’2019-02-25 06:21:09′,’2019-02-25′)»
Ответ №1:
Spark поддерживает синтаксис hive, поэтому, если вы хотите вставить строку, вы можете сделать следующее
insert into hello select t.* from (select 1, 'hello') t;
Комментарии:
1. Спасибо за ваш ответ. Кажется слишком подробным для простого оператора insert, но это определенно способ сделать это.
2. Как насчет случая, когда необходимо вставить данные в некоторые столбцы, а не во все из них? например: таблица содержит три столбца col0, col1 и col2, и мне нужно вставить значения int col0 и col2. Как я могу это сделать?
3. Я не вижу, чем ваше решение лучше решения, уже предоставленного в вопросе (без учета имен столбцов)
4. Если источник данных spark поддерживает пользовательскую схему (реализует SchemaRelationProvider) и позволяет опускать некоторые столбцы. Вы можете создать отдельное сопоставление таблиц только со столбцами, которые вы хотите обновить, и использовать вставки в этой таблице.