Size: a a a

2021 August 30

ЕГ

Евгений Глотов... in Moscow Spark
В hdfs
источник

ЕГ

Евгений Глотов... in Moscow Spark
Если это хайв мэнэджед таблица, то можно переименовать таблицу, папка поменяет название
источник

SI

Sergey Ivanychev in Moscow Spark
Так, сформулирую вопрос в коде. Вот у меня есть датафрейм со схемой

schema = StructType([
 StructField("field", StructType([
   StructField("nested", LongType())
 ]))
])
df = spark.createDataframe(..., schema=schema)
источник

SI

Sergey Ivanychev in Moscow Spark
Есть новая схема

new_schema = StructType([
 StructField("field", StructType([
   StructField("nested", LongType()),
   StructField("one_more_nested", LongType()),
 ]))
])
источник

SI

Sergey Ivanychev in Moscow Spark
Можно ли мне привести датафрейм к новой схеме как-то автоматом?
источник

ЕГ

Евгений Глотов... in Moscow Spark
Нет конечно, надо писать withColumn, а если добавлять поле в структуру, то это ещё больший гемор
источник

SI

Sergey Ivanychev in Moscow Spark
почему «конечно»? я знаю тупой способ — написать старый датафрейм в паркет, потом append-ом дописать паркетник с новой схемой и прочитать с mergeSchema=true — но это не очень красиво
источник

SI

Sergey Ivanychev in Moscow Spark
то есть по факту спарк умеет мерджить схемы и их приводить
источник

ЕГ

Евгений Глотов... in Moscow Spark
А работает ли он с вложенными структурами? По-моему не во всех случаях, например, если в одной части схема с колонкой стринг, а в другой структ
источник

SI

Sergey Ivanychev in Moscow Spark
я подразумеваю что схемы совместимы
источник

SI

Sergey Ivanychev in Moscow Spark
работает
источник

ЕГ

Евгений Глотов... in Moscow Spark
Надо сделать что-то вроде struct(col("nested.field").alias("field"), lit(None).cast("long").alias("one_more_nested")).alias("field")
источник

ЕГ

Евгений Глотов... in Moscow Spark
Пересобирать структуру
источник

t

tenKe in Moscow Spark
+
источник

SI

Sergey Ivanychev in Moscow Spark
но повторюсь, я могу ведь тупо его написать на диск и прочитать с новой схемой — и это будет работать. Ты предлагаешь ручное решение, меня интересует есть ли какое-то автоматическое
источник

SI

Sergey Ivanychev in Moscow Spark
Я попробовал new_df = spark.createDataframe(df.rdd, schema=new_schema) но оно взрывается при добавлении внутренних полей
источник

t

tenKe in Moscow Spark
почему ручное? Напиши функцию, которая обходит старую схему по дереву, и приводит ее к новому виду
источник

ИК

Иван Калининский... in Moscow Spark
автоматического из коробки нет, можно сделать самому, но на пайтоне не знаю как

Есть запись файлов метаинформации для Parquet («_common_metadata»), эти файлы делают ненужным mergeSchema=true, но deprecated, поэтому тоже не могу посоветовать

и можно переопределить Hive таблицу, дропнуть и создать с новым составом полей, если она external, то папка с данными не сотрётся. При этом поля, которых нет в файлах будут null, которые не обозначены не будут прочитаны при обращении к таблице
«Не обозначены», значит что этих полей нет в DDL таблицы
источник

SI

Sergey Ivanychev in Moscow Spark
Вот я не хочу эту функцию писать, потому что боюсь прострелить себе ногу
источник

SI

Sergey Ivanychev in Moscow Spark
На скале я тоже могу это сделать, ты знаешь способ?
источник