मुझे स्पार्क में रेगेक्स का उपयोग करके JSON स्ट्रिंग से मान पुनर्प्राप्त करने में समस्या हो रही है।

मेरा पैटर्न है:

val st1 = """id":"(.*?)"""
val pattern = s"${'"'}$st1${'"'}"
//pattern is: "id":"(.*?)"

डीएफ में मेरी टेस्ट स्ट्रिंग है

import spark.implicits._
val jsonStr = """{"type":"x","identifier":"y","id":"1d5482864c60d5bd07919490"}"""                         
val df = sqlContext.sparkContext.parallelize(Seq(jsonStr)).toDF("request")   

मैं फिर आईडी मान को पार्स करने और इसे यूडीएफ के माध्यम से डीएफ में जोड़ने की कोशिश कर रहा हूं:

def getSubStringGroup(pattern: String) = udf((request: String) => {
  val patternWithResponseRegex = pattern.r
  var subString = request match {
    case patternWithResponseRegex(idextracted) => Array(idextracted)
    case _ => Array("na")
  }
  subString
})

val dfWithIdExtracted = df.select($"request")
  .withColumn("patternMatchGroups", getSubStringGroup(pattern)($"request"))
  .withColumn("idextracted", $"patternMatchGroups".getItem(0))
  .drop("patternMatchGroups")

इसलिए मैं चाहता हूं कि मेरा df ऐसा दिखे

|------------------------------------------------------------- | ------------------------|
|      request                                                 |           id            |
|------------------------------------------------------------- | ------------------------|
|{"type":"x","identifier":"y","id":"1d5482864c60d5bd07919490"} | 1d5482864c60d5bd07919490|
| -------------------------------------------------------------|-------------------------|

हालांकि, जब मैं उपरोक्त विधि का प्रयास करता हूं, तो regex101.com< पर काम करने के बावजूद मेरा मैच "नल" के रूप में वापस आ जाता है। /ए>

क्या कोई किसी अन्य विधि की सलाह या सुझाव दे सकता है? धन्यवाद।

Krzysztof के समाधान के बाद, मेरी तालिका अब इस तरह दिखती है:

|------------------------------------------------------------- | ------------------------|
|      request                                                 |           id            |
|------------------------------------------------------------- | ------------------------|
|{"type":"x","identifier":"y","id":"1d5482864c60d5bd07919490"} | "id":"1d5482864c60d5bd07919490"|
| -------------------------------------------------------------|-------------------------|

मैंने अनावश्यक वर्णों को ट्रिम करने के लिए एक नया udf बनाया और इसे df में जोड़ा:

def trimId = udf((idextracted: String) => {
  val id = idextracted.drop(6).dropRight(1)
  id
})


val dfWithIdExtracted = df.select($"request")
  .withColumn("patternMatchGroups", getSubStringGroup(pattern)($"request"))
  .withColumn("idextracted", $"patternMatchGroups".getItem(0))
  .withColumn("id", trimId($"idextracted"))
  .drop("patternMatchGroups", "idextracted")

Df अब वांछित दिखता है। फिर से धन्यवाद क्रिज़िस्तोफ़!

1
Zack 3 जून 2019, 22:11

1 उत्तर

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

जब आप रेगेक्स के साथ मिलान करने वाले पैटर्न का उपयोग कर रहे हैं, तो आप पूरी स्ट्रिंग से मिलान करने का प्रयास कर रहे हैं, जो स्पष्ट रूप से सफल नहीं हो सकता है। इसके बजाय आपको findFirstMatchIn का उपयोग करना चाहिए:

def getSubStringGroup(pattern: String) = udf((request: String) => {
   val patternWithResponseRegex = pattern.r
   patternWithResponseRegex.findFirstIn(request).map(Array(_)).getOrElse(Array("na"))
})

आप अपने पैटर्न को बहुत ही विचित्र तरीके से बना रहे हैं जब तक कि आपके पास इसके लिए विशेष उपयोग का मामला न हो। आप बस कर सकते थे:

val pattern = """"id":"(.*?)""""
1
Krzysztof Atłasik 3 जून 2019, 19:51