मेरे पास एकाधिक कॉलम वाला डेटाफ्रेम है जिसमें से एक कॉलम नक्शा (स्ट्रिंग, स्ट्रिंग) प्रकार है। मैं इस डेटाफ्रेम को मैप के रूप में कॉलम वाले प्रिंट करने में सक्षम हूं जो डेटा को मैप ("PUN" -> "पुणे") के रूप में देता है। मैं इस डेटाफ्रेम को हाइव टेबल (एव्रो के रूप में संग्रहीत) में लिखना चाहता हूं जिसमें टाइप मैप के साथ एक ही कॉलम है।
Df.withcolumn("cname", lit("Pune"))
withcolumn("city_code_name", map(lit("PUN"), col("cname"))
Df.show(false)
//table - created external hive table..stored as avro..with avro schema
इस मैप टाइप कॉलम को हटाने के बाद मैं डेटाफ्रेम को हाइव एवरो टेबल में सेव करने में सक्षम हूं।
हाइव टेबल के लिए रास्ता बचाओ:
- स्पार्क.सेव - एवरो फाइल को सेव करना
- स्पार्क.एसक्यूएल - एवरो फ़ाइल स्थान के साथ हाइव टेबल पर विभाजन बनाना
2 जवाब
इस टेस्ट केस को स्पार्क टेस्ट से एक उदाहरण के रूप में देखें
test("Insert MapType.valueContainsNull == false") {
val schema = StructType(Seq(
StructField("m", MapType(StringType, StringType, valueContainsNull = false))))
val rowRDD = spark.sparkContext.parallelize(
(1 to 100).map(i => Row(Map(s"key$i" -> s"value$i"))))
val df = spark.createDataFrame(rowRDD, schema)
df.createOrReplaceTempView("tableWithMapValue")
sql("CREATE TABLE hiveTableWithMapValue(m Map <STRING, STRING>)")
sql("INSERT OVERWRITE TABLE hiveTableWithMapValue SELECT m FROM tableWithMapValue")
checkAnswer(
sql("SELECT * FROM hiveTableWithMapValue"),
rowRDD.collect().toSeq)
sql("DROP TABLE hiveTableWithMapValue")
}
यदि आप सेव विकल्प चाहते हैं तो आप सेवएस्टेबल के साथ प्रयास कर सकते हैं जैसा कि दिखाया गया है यहां
Seq(9 -> "x").toDF("i", "j")
.write.format("hive").mode(SaveMode.Overwrite).option("fileFormat", "avro").saveAsTable("t")
Yourdataframewithmapcolumn.write.partitionBy विभाजन बनाने का तरीका है।
आप इसे saveAsTable से हासिल कर सकते हैं उदाहरण:
Df\
.write\
.saveAsTable(name='tableName',
format='com.databricks.spark.avro',
mode='append',
path='avroFileLocation')
जो भी आपको सूट करे, उसमें मोड विकल्प बदलें
sparkSession.sql(s"alter table tablename ADD partition(p1='210') location 'path'")
- विभाजन बनाने के लिए नोट - यह मानचित्र प्रकार के कॉलम के बिना एकदम सही काम कर रहा है और इस कोड को चलाने से पहले हाइव टेबल अलग से बनाया गया हैERROR- Caused by: java.lang.NullPointerException: in topLevelRecord in union in map in <fieldname>