2016-01-06 8 views
6

के मिलान के मामले के माध्यम से स्पार्कएसक्यूएल में किसी प्रकार के आधार पर मूल्य कनवर्ट करें क्या स्कैला में एक पैरामीट्रिक प्रकार से मिलान करना संभव है? आइए कहें कि मेरे पास एक ऐसा फ़ंक्शन है जो दो पैरामीटर प्राप्त करता है: value और type। मैं एक प्रकार के रूपांतरण करने के लिए पैटर्न मिलान का उपयोग करना चाहता हूं।टाइप

कुछ इस तरह:

datatype match { 
    case IntegerType => return value.toInt 
    case FloatType => return value.toFloat 
    case StringType => return value 
    case DecimalType(_,_) => return BigDecimal(value) // this is not working 
    case _ => return strrepr 
} 

यहाँ DecimalType परिशुद्धता आवश्यक परिशुद्धता निर्दिष्ट करने के लिए दो पैरामीटर स्वीकार करता है। यह उदाहरण के लिए हो सकता है:

  • लिए case DecimalType => return BigDecimal(value) मैं:

    error: pattern type is incompatible with expected type; 
        found : org.apache.spark.sql.types.DecimalType.type 
        required: org.apache.spark.sql.types.DataType 
        Note: if you intended to match against the class, try `case DecimalType(_,_)` 
    
  • case DecimalType(_,_) => return BigDecimal(value) लिए

    org.apache.spark.sql.types.DecimalType = DecimalType(10,2) 
    

    मैं कई विकल्प और कुछ भी नहीं की कोशिश की है काम कर रहा है मुझे मिलता है:

    error: result type Boolean of unapply defined in method unapply in object DecimalType does not conform to Option[_] or Boolean 
    
  • case DecimalType[_,_] => return BigDecimal(value) के लिए मैं मिलता है:

    error: org.apache.spark.sql.types.DecimalType does not take type parameters 
    
+0

दशमलव प्रकार क्या है? यदि आपका मतलब है [org.apache.spark.sql.types.DecimalType] (https://spark.apache.org/docs/1.4.1/api/scala/index.html#org.apache.spark.sql.types DecimalType), यह मेरे लिए एक पैरामीट्रिक प्रकार की तरह दिखता नहीं है। – Suma

उत्तर

4

समस्या अपने कोड में return का उपयोग है। आपने कहा कि आप कहीं भी इस फ़ंक्शन में इस कोड स्निपेट का उपयोग करते हैं। उस समारोह का रिटर्न प्रकार क्या है? जाहिर है, आप का इरादा है कि कभी-कभी यह इंटीजर होता है, कभी-कभी स्ट्रिंग, कभी-कभी बिगडेसिमल; लेकिन यदि आप return का उपयोग करते हैं, तो यह फ़ंक्शन के रिटर्न प्रकार को निर्धारित करने के लिए लौटे ऑब्जेक्ट के प्रकार को देखेगा। सामान्य रूप से, आपको स्कैला कोड में return का उपयोग करने से दृढ़ता से बचना चाहिए। फ़ंक्शन बॉडी में अंतिम मूल्यांकन मूल्य वापस कर दिया जाता है। return का उपयोग करने का एकमात्र मामला तब होता है जब आप फ़ंक्शन बॉडी में कहीं और मूल्य को वापस करने के लिए मजबूर करना चाहते हैं। लेकिन फिर भी, एक बेहतर तरीका रिटर्न ऑब्जेक्ट को एक चर में सहेजना होगा और केवल उस फ़ंक्शन बॉडी की अंतिम पंक्ति में उस चर का मूल्यांकन करना होगा। और कभी भी वापसी का उपयोग न करें!

return के बिना यह वापसी के साथ

scala> val datatype = DecimalType(10, 2) 
datatype: org.apache.spark.sql.types.DecimalType = DecimalType(10,2) 

scala> val value = BigDecimal(10) 
value: scala.math.BigDecimal = 10 

scala> datatype match {case DecimalType(_,_) => value} 
res150: scala.math.BigDecimal = 10 

** समस्याएं काम करता है **

scala> def test = {datatype match {case DecimalType(_,_) => return value}} 
<console>:138: error: method test has return statement; needs result type 
     def test = {datatype match {case DecimalType(_,_) => return value}} 

scala> def test:BigDecimal = {datatype match {case DecimalType(_,_) => return value}} 
test: BigDecimal 

scala> def test:DataType = {datatype match {case DecimalType(_,_) => return value}} 
<console>:138: error: type mismatch; 
found : scala.math.BigDecimal 
required: org.apache.spark.sql.types.DataType 
     def test:DataType = {datatype match {case DecimalType(_,_) => return value}} 

scala> def test3 = {datatype match {case DecimalType(_,_) => value}} 
test3: scala.math.BigDecimal 
+0

नकारात्मक वोट क्यों? यह एक वैध स्कैला त्रुटि है ... – KrisP

+0

क्रिसप, आपके उत्तर के लिए धन्यवाद।समस्या रिटर्न के साथ नहीं थी - मुझे संदेह है कि जिस काम को प्राप्त हो रहा था उस डेटाटाइप (10,2) बल्कि क्लास संदर्भ नहीं था। कुछ '' org.apache.spark.sql.types.DecimalType $ @ 40ff96ee'' की तरह। आपका कोड पूरी तरह से काम कर रहा है, मैंने फ़ंक्शन को प्राप्त करने वाले पैरामीटर को गलत समझा (मैं स्कैला और स्पार्क के लिए नया हूं)। सहायता के लिए धन्यवाद। यहां अंत में क्या काम किया गया है: 'case _: DecimalType => BigDecimal (मान) ''। साथ ही, यह अभी भी एक रहस्य है कि यह अन्य वर्ग प्रकारों के साथ क्यों काम कर रहा था .. – Radu

2

बाहर कर देता है कि DecimalType केवल पैटर्न शून्य तर्क के साथ मेल खाता है:

case DecimalType() => ... 

हैं आपको परिशुद्धता और पैमाने की आवश्यकता है , आपको मामले के प्रकार को परिभाषित करना होगा और मैन्युअल रूप से उन्हें निकालना होगा:

datatype match { 
    case dt: DecimalType => 
    val precision = dt.precision 
    val scale = dt.scale 
    ... 
संबंधित मुद्दे