2016-03-21 8 views
0

Die Hive-Tabelle wurde mit 4 Partitionen erstellt.Spark-Hive-Partitionierung

CREATE TABLE IF NOT EXISTS hourlysuspect (cells int, sms_in int) partitioned by (traffic_date_hour string) stored as ORC into 4 buckets 

Die folgenden Zeilen in der Funkencode Einfügen von Daten in dieser Tabelle

hourlies.write.partitionBy("traffic_date_hour").insertInto("hourly_suspect") 

und in der Funken defaults.conf, ist die Anzahl der parallelen Prozesse 128

spark.default.parallelism=128 

The Problem ist, dass, wenn die Einfügungen in der Hive-Tabelle passieren, es 128 Partitionen statt 4 Buckets hat. Der StandardwertParallelismus kann nicht auf 4 reduziert werden, da dies zu einem sehr sehr langsamen System führt. Außerdem habe ich die DataFrame.coalesce-Methode ausprobiert, aber das macht die Einfügungen zu langsam.

Gibt es eine andere Möglichkeit, die Anzahl der Buckets auf 4 zu erhöhen, wenn die Daten in die Tabelle eingefügt werden?

+0

Mehr Einsicht benötigt, speziell Code für hourlies.write. Aber wenn ich raten muss, versuchen Sie, Daten zu speichern, ohne Collect oder Take zu verwenden. So versucht jeder Executor, Daten in hdfs zu speichern, wodurch es 128 wird (was Ihre Parallelität ist). –

+0

Das ist richtig, die Executoren schreiben mit der Standardparallelität in hdfs. hourlies ist ein DataFrame und write ist eine für den DataFrame definierte Funktion – sparkDabbler

Antwort

0

Ab heute {spark 2.2.0} Spark unterstützt das native Schreiben von Bucket-Hive-Tabellen mit spark-sql nicht. Beim Erstellen der Bucketed-Tabelle sollte eine clusteredBy-Klausel für eine der Spalten des Tabellenschemas vorhanden sein. Ich sehe das nicht in der angegebenen CreateTable-Anweisung. Angenommen, es existiert und Sie kennen die Clusterspalte, können Sie die API .bucketBy ([colName]) API hinzufügen, während Sie die API DataFrameWriter verwenden.

Weitere Details zu Spark2.0 +: [Link] (https://spark.apache.org/docs/2.0.0/api/java/org/apache/spark/sql/DataFrameWriter.html)