2017-01-18 12 views
0

Я имею в PSspark в DataFrame в формате нижеPartition колонны Timestamp в Dataframes Pyspark

Date  Id Name Hours Dno Dname 
12/11/2013 1 sam  8  102 It 
12/10/2013 2 Ram  7  102 It 
11/10/2013 3 Jack 8  103 Accounts 
12/11/2013 4 Jim  9  101 Marketing 

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

df.write.saveAsTable(
    'default.testing', mode='overwrite', partitionBy='Dno', format='parquet') 

Запрос работал нормально и создал таблицу в Улье с входом Паркета.

Теперь я хочу сделать секционированным в зависимости от года и месяца столбца даты. Временная метка - временная отметка Unix

как мы можем достичь этого в PySpark. Я сделал это в улье, но не смог это сделать PySpark

ответ

3

Просто извлеките поля, которые хотите использовать, и укажите список столбцов в качестве аргумента для автора partitionBy. Если timestamp в UNIX Timestamps выражается в секундах:

df = sc.parallelize([ 
    (1484810378, 1, "sam", 8, 102, "It"), 
    (1484815300, 2, "ram", 7, 103, "Accounts") 
]).toDF(["timestamp", "id", "name", "hours", "dno", "dname"]) 

добавить столбцы:

from pyspark.sql.functions import year, month, col 

df_with_year_and_month = (df 
    .withColumn("year", year(col("timestamp").cast("timestamp"))) 
    .withColumn("month", month(col("timestamp").cast("timestamp")))) 

и написать:

(df_with_year_and_month 
    .write 
    .partitionBy("year", "month") 
    .mode("overwrite") 
    .format("parquet") 
    .saveAsTable("default.testing")) 
+1

Я попробовал технику разделить на час, а затем записать паркетом: DF .write.partitionBy ('hour'). паркет (путь), однако, несмотря на то, что у меня есть не менее 10 уникальных часов в df, я получаю только 2 части паркета - можете ли вы объяснить это? Благодаря! – roy650