इसलिए मुझे हर निश्चित समय में परिणाम और इनपुट जानकारी के साथ एक तालिका बनाए रखने की आवश्यकता है, क्योंकि JDBC और स्पार्क में UPSERT के लिए कोई विकल्प नहीं है और जैसा कि मैं परिणामों को इनपुट करते समय तालिका को खाली होने की अनुमति नहीं दे सकता या उनके लिए दोगुना होने के लिए, मैंने अपना खुद का एक यूपीएसईआरटी फ़ंक्शन बनाया। समस्या यह है कि मेरे पास मेरे डेटाफ्रेम में इनट्स का लपेटा हुआ ऐरे है और मैं इसे जावा ऑब्जेक्ट में अनुवाद करने में सक्षम नहीं लग रहा हूं जो मुझे इसे तैयार किए गए स्टेटमेंट में डालने देगा।

मेरे कोड से प्रासंगिक हिस्सा इस तरह दिखता है:

import java.sql._
val st: PreparedStatement = dbc.prepareStatement("""
INSERT INTO """ + table + """ as tb """ + sliced_columns + """
VALUES"""+"(" + "?, " * (columns.size - 1) + "?)"+"""
ON CONFLICT (id) 
DO UPDATE SET """ + column_name + """= CAST (? AS _int4), count_win=?, occurrences=?, "sumOccurrences"=?, win_rate=?  Where tb.id=?;
""")

जैसा कि आप देख सकते हैं कि मैंने WrappedArray को एक स्ट्रिंग के रूप में लिखने की कोशिश की और फिर इसे SQL कोड में ही डाला, लेकिन यह एक बहुत ही खराब समाधान की तरह लगता है।

मैंने इसे इनपुट भाग के रूप में बनाया है, यह किस कॉलम प्रकार के आधार पर अलग-अलग क्रियाएं कर रहा है:

for (single_type <- types){
      single_type._2 match {
        case "IntegerType" => st.setInt(counter + 1, x.getInt(counter))
        case "StringType" => st.setString(counter + 1, x.getString(counter))
        case "DoubleType" => st.setDouble(counter + 1, x.getDouble(counter))
        case "LongType" => st.setLong(counter + 1, x.getLong(counter))
        case _ => st.setArray(counter + 1, x.getList(counter).toArray().asInstanceOf[Array])
      }

यह एक त्रुटि देता है जो Ljava.lang.Object; java.sql.Array पर कास्ट नहीं किया जा सकता। मैं वास्तव में किसी भी मदद की सराहना करता हूँ!

0
Michael Ostrovsky 25 पद 2017, 20:58

2 जवाब

सबसे बढ़िया उत्तर

समस्या को अंततः createArrayOf . कमांड द्वारा हल किया गया था

st.setArray(counter + 1, conn.createArrayOf("int4", x.getList[Int](4).toArray()))
0
Michael Ostrovsky 26 पद 2017, 14:02

Array एक प्रकार का कंस्ट्रक्टर है जो टाइप नहीं है:

import org.apache.spark.sql.Row

Row(Seq(1, 2, 3)).getList(0).toArray.asInstanceOf[Array[_]]

लेकिन toArray (प्रकार के साथ) पर्याप्त होना चाहिए

Row(Seq(1, 2, 3)).getList[Int](0).toArray
0
user9139588 25 पद 2017, 22:14