2017-01-18 6 views
0

私はdnoに基づいてパーティションを行い、寄木細工の形式を使用してハイブにテーブルとして保存する以下の形式でPSsparkでDataFrameパーティション

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 

を持っています。

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

クエリは正常に機能し、ハイケとパーケット入力でテーブルが作成されました。

今、私は日付の列の年と月に基づいて分割したいと思います。タイムスタンプはUnixのタイムスタンプです

どのようにPySparkでこれを達成できますか?私はハイブでやったができなかったPySpark

答えて

3

ライターのpartitionByの引数として、使用するフィールドを抽出して列のリストを提供するだけです。

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 timestampは、UNIXは、秒単位で表さタイムスタンプである場合.write.partitionBy( '​​hour')。parquet(path)、しかし、dfに少なくとも10のユニークな時間があるにもかかわらず、私は寄木細工の部分を2つしか得ていません。ありがとう! – roy650

関連する問題