J'essaie de tester comment écrire des données dans HDFS 2.7 en utilisant Spark 2.1. Mes données sont une simple séquence de valeurs factices et la sortie doit être partitionnée par les attributs: id et clé.Comment enregistrer un fichier parqueté partitionné dans Spark 2.1?
// Simple case class to cast the data
case class SimpleTest(id:String, value1:Int, value2:Float, key:Int)
// Actual data to be stored
val testData = Seq(
SimpleTest("test", 12, 13.5.toFloat, 1),
SimpleTest("test", 12, 13.5.toFloat, 2),
SimpleTest("test", 12, 13.5.toFloat, 3),
SimpleTest("simple", 12, 13.5.toFloat, 1),
SimpleTest("simple", 12, 13.5.toFloat, 2),
SimpleTest("simple", 12, 13.5.toFloat, 3)
)
// Spark's workflow to distribute, partition and store
// sc and sql are the SparkContext and SparkSession, respectively
val testDataP = sc.parallelize(testData, 6)
val testDf = sql.createDataFrame(testDataP).toDF("id", "value1", "value2", "key")
testDf.write.partitionBy("id", "key").parquet("/path/to/file")
J'attends pour obtenir la structure arborescente suivante dans HDFS:
- /path/to/file
|- /id=test/key=1/part-01.parquet
|- /id=test/key=2/part-02.parquet
|- /id=test/key=3/part-03.parquet
|- /id=simple/key=1/part-04.parquet
|- /id=simple/key=2/part-05.parquet
|- /id=simple/key=3/part-06.parquet
Mais quand je lance le code précédent je reçois la sortie suivante:
/path/to/file/id=/key=24/
|-/part-01.parquet
|-/part-02.parquet
|-/part-03.parquet
|-/part-04.parquet
|-/part-05.parquet
|-/part-06.parquet
Je ne sais pas s'il y a quelque chose qui ne va pas dans le code, ou est-ce qu'il y a autre chose que fait Spark?
J'exécution spark-submit
comme suit:
étincelle soumettre --name APP --master 30G --executor-mémoire --driver-mémoire locale 30G noyaux --executor-8 --num -executors 8 --conf spark.io.compression.codec = lzf --conf spark.akka.frameSize = 1024 --conf spark.driver.maxResultSize = 1g --conf spark.sql.orc.compression.codec = non compressé - -conf spark.sql.parquet.filterPushdown = true --class myClass myFatJar.jar