मेरे पास एकाधिक कॉलम वाला डेटाफ्रेम है जिसमें से एक कॉलम नक्शा (स्ट्रिंग, स्ट्रिंग) प्रकार है। मैं इस डेटाफ्रेम को मैप के रूप में कॉलम वाले प्रिंट करने में सक्षम हूं जो डेटा को मैप ("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

इस मैप टाइप कॉलम को हटाने के बाद मैं डेटाफ्रेम को हाइव एवरो टेबल में सेव करने में सक्षम हूं।

हाइव टेबल के लिए रास्ता बचाओ:

  1. स्पार्क.सेव - एवरो फाइल को सेव करना
  2. स्पार्क.एसक्यूएल - एवरो फ़ाइल स्थान के साथ हाइव टेबल पर विभाजन बनाना
0
Mintu Choudhary 27 फरवरी 2020, 20:44

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 विभाजन बनाने का तरीका है।

1
Ram Ghadiyaram 28 फरवरी 2020, 09:46
मैं अस्थायी तालिका बनाने से बचना चाहता हूं और उपरोक्त विधि से पहले की तरह ही सहेजना चाहता हूं, बस डेटाफ्रेम को नए मानचित्र प्रकार कॉलम के साथ अपडेट करना चाहता हूं और इसे सीधे हाइव टेबल पर सहेजना चाहता हूं जिसे एवरो के रूप में संग्रहीत किया जाता है।
 – 
Mintu Choudhary
28 फरवरी 2020, 08:44
`स्पार्क.क्रिएटडेटाफ्रेम (df.rdd, st) .write.format("com.databricks.spark.avro").mode(SaveMode.Overwrite).save(path)` - दिए गए पथ पर एवरो फ़ाइल को सहेजने के लिए इसका उपयोग करना sparkSession.sql(s"alter table tablename ADD partition(p1='210') location 'path'") - विभाजन बनाने के लिए नोट - यह मानचित्र प्रकार के कॉलम के बिना एकदम सही काम कर रहा है और इस कोड को चलाने से पहले हाइव टेबल अलग से बनाया गया है
 – 
Mintu Choudhary
28 फरवरी 2020, 12:46
ERROR- Caused by: java.lang.NullPointerException: in topLevelRecord in union in map in <fieldname>
 – 
Mintu Choudhary
28 फरवरी 2020, 12:55

आप इसे saveAsTable से हासिल कर सकते हैं उदाहरण:

    Df\
        .write\
        .saveAsTable(name='tableName',
                     format='com.databricks.spark.avro',
                     mode='append',
                     path='avroFileLocation')

जो भी आपको सूट करे, उसमें मोड विकल्प बदलें

0
Nambu14 28 फरवरी 2020, 00:17