Конвертируйте искровой фрейм данных в таблицу создания разделов кустов в pyspark, используя в качестве разделов последние два столбца. - PullRequest
1 голос
/ 02 июля 2019

У меня есть датафрейм в Pyspark (2.3), из которого мне нужно сгенерировать секционированный оператор создания таблицы для запуска через spark.sql (), чтобы сделать его совместимым с ульями.

Sample Dataframe:
 final.printSchema()
root
 |-- name: string (nullable = true)
 |-- age: string (nullable = true)
 |-- value: long (nullable = true)
 |-- date: string (nullable = true)
 |-- subid: string( nullable=true)

Скрипт должен прочитать фрейм данных, создать таблицу ниже и рассмотреть последние два столбца как разделенные столбцы.

`create table schema.final( name string ,age string  ,value long ) 
     partitioned by (date string , subid string) stored as parquet;`

Любая помощь с вышеупомянутым решением pyspark будет действительно великолепной

1 Ответ

1 голос
/ 03 июля 2019

Вот один из подходов: перебор схемы и генерация Hive SQL:

from pyspark.sql.types import StructType, StructField, StringType, LongType

schema = StructType([
  StructField('name', StringType()),
  StructField('age', StringType()),
  StructField('value', LongType()),
  StructField('date', StringType()),
  StructField('subid', StringType())
])

hiveCols = ""
hivePartitionCols = ""
for idx, c in enumerate(schema):
  # populate hive schema
  if(idx < len(schema[:-2])):
    hiveCols += "{0} {1}".format(c.name, c.dataType.simpleString())

    if(idx < len(schema[:-2]) - 1):
      hiveCols += ","


  # populate hive partition
  if(idx >= len(schema) - 2):
    hivePartitionCols += "{0} {1}".format(c.name, c.dataType.simpleString())

    if(idx < len(schema) - 1):
      hivePartitionCols += ","

hiveCreateSql = "create table schema.final({0}) partitioned by ({1}) stored as parquet".format(hiveCols, hivePartitionCols)
# create table schema.final(name string,age string,value bigint) partitioned by (date string,subid string) stored as parquet

spark.sql(hiveCreateSql)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...