Как вставить значение в пустой фрейм данных в искре

Я разрабатываю искровое приложение с использованием SPARK sql, одна из моих задач - выбрать значение из двух таблиц и вставить его в пустую таблицу, что является моим результатом. но для этого я экспериментирую с искрой для создания пустой таблицы, я создал пустой фрейм данных, но не могу зарегистрировать его как таблицу, вот моя ситуация, теперь код

from pyspark import SQLContext
from pyspark.sql.types import StructType,StructField,StringType,DateType,IntegerType
sqlc=SQLContext(sc)

schema= StructType([StructField("Name",StringType(),False),StructField("AGE",IntegerType(),False),StructField("DATE",DateType(),False)])

dataframe=sqlc.createDataFrame([],schema)
dataframe.show()

он показывает кадр данных, но я не уверен, является ли он регистром или нет, потому что нет значения

dataframe.registerTempTable("Exp")
experiment=sqlc.sql("SELECT * FROM Exp")
experiment.show()

Я думаю, что делаю здесь ошибку, поэтому для этой проблемы я хочу вставить какое-то значение для тестирования, но я не могу этого сделать. Я новичок в искре, поэтому не знаю, как решить эту ситуацию. я просмотрел некоторые форумы, я видел, как какой-то пользователь форума упомянул о методе parallelize() для создания таблицы, но я не совсем понял, как он работает. Обязательно ли использовать контекст куста для целей работы? мои требования выполняют эту работу без контекста улья. Пожалуйста, направь меня


person Kalyan    schedule 03.08.2016    source источник
comment
Почему Hadoop упоминается в тегах? Поправьте меня, если я ошибаюсь, но в вопросе, похоже, вообще не упоминается Hadoop?   -  person Grzegorz Oledzki    schedule 03.08.2016
comment
ой, извините, это было в предложении, я не удалил его по ошибке, спасибо   -  person Kalyan    schedule 03.08.2016


Ответы (2)


Краткий ответ: вы этого не сделаете.

Фреймы данных Spark создаются на основе RDD, которые являются неизменяемыми. Поначалу к этому немного сложно привыкнуть, но с этим можно работать.

Вы можете создать совершенно новый DataFrame, выполнив некоторые преобразования в существующем (например, используя операторы SQL в вашем spark-sql), прочитав некоторые входные данные или введя данные вручную с помощью sqlContext.createDataFrame(...) .

Есть ли какая-то особая причина, по которой вы не можете просто создать новый DataFrame со своим результатом и зарегистрировать его как таблицу, если вам нужно?

редактировать: я не уверен, правильно ли я понял ваш вопрос... может быть, то, что я предлагаю, это именно то, что вы хотите сделать. В этом случае:

df = sqlContext.createDataFrame([("val1","val2","val1")], ["colName1", "colName2", "colName3"])
person grepe    schedule 03.08.2016
comment
спасибо за ваш ответ, мой сценарий таков: я получаю данные из удаленной базы данных, загружаю их в искру и создаю registerTempTable, я выполняю над этим операцию. У меня есть две временные таблицы, которые я объединим, а затем вставлю результат в новую свежую пустую таблицу. Я создал пустой фрейм данных и таблицу, но не смог их вставить. - person Kalyan; 03.08.2016
comment
grepe, я пробовал ваш приведенный выше код, он работает. этим я создал фрейм данных с пустым значением, подобным этому ( , , ), а также создал временную таблицу. и здесь я попытался вставить некоторые значения с помощью SQL-запроса, такого как sqlcontext.sql (INSERT INTO TABLE (имя столбца) VALUES (значения)), но мне это не удалось. возможно ли сделать такой запрос. извините, что снова беспокою вас :) - person Kalyan; 08.08.2016
comment
@Kalyan, как я уже писал ранее, после создания DF он высечен в камне. вы не можете изменить его и, следовательно, вы не можете делать с ним такие вещи, как обновление или вставка SQL. вы должны создавать новый фрейм данных каждый раз, когда вы что-то меняете. когда вам нужен файл с данными из вашего старого DF и некоторыми новыми записями, вы создаете DF с новыми записями и используете (union)[spark.apache.org/docs/latest/api/python/ для создания DF с данными из обоих. когда вы запускаете SQL-подобный оператор, результат уже является новым DF. возможно, вы хотите использовать что-то вроде Hive вместо искры, если вам нужны вставки? - person grepe; 09.08.2016

parallelize() для создания таблицы, но я не совсем понял, как он работает.

Проще говоря, метод parallize берет последовательность ввода и создает из нее разделение ввода.

для этой проблемы я хочу вставить некоторое значение для тестирования

Вам нужно либо распараллелить список объектов Dataframe Row, либо создать файл и сопоставить схему SQL с этим

моя работа заключается в выборе значения из двух таблиц

Тогда начните там. Напишите оператор SELECT для двух таблиц, он возвращает новую таблицу, которую вы регистрируете и можете записать в базу данных/диск.

person OneCricketeer    schedule 03.08.2016
comment
спасибо за ваш ответ, я видел в блоках данных метод parallelize(), но он также сказал, что мне нужно использовать saveasTable() вместо registerTempTable(), но я до сих пор понимаю, что saveasTable() мы можем использовать, если есть Hivecontext или Hive мета таблица. вот этот термин меня смущает. в любом случае спасибо попробую вашу идею :) - person Kalyan; 03.08.2016
comment
Я не понимаю, что вы спрашиваете. Вы можете использовать API Dataframe без HiveContext. Но вы должны использовать HiveContext, если данные загружаются в Hive. - person OneCricketeer; 03.08.2016
comment
я просто использую искру в автономном режиме. и не загружая данные в улей, поэтому вы говорите, что если мои данные загружены в улей, то я должен использовать hivecontext Right. но где-то я читал, что если я хочу сохранить таблицу навсегда, мне нужно работать с hivecontext, что меня смутило. извините за беспокойство, моя концепция была неясной, но у меня есть идея - person Kalyan; 03.08.2016