key-in-fall-leaves

我最近完成了两个资产的写作 –基于 Spark 的数据引入框架和基于 Spark 的数据质量框架;两者都是元数据驱动的。通常,资产的行为存储在 RDBMS 中。在数据引入框架中,我需要存储源的参数(如用户名、密码、路径、格式等)、目标(用户名、密码、路径、格式等信息)、压缩等。在普通架构中,我看到这些参数建模为表中的列。

作为一个程序员的心脏,我决定不使用多个列。相反,所有参数都将存储在单个列中(作为数据库表中的字符串)。Spark 应用程序将负责读取字符串并提取所需的参数。

做出这个(看似简单的)决定后,下一步是定义”参数”字符串的格式。为此,我毫不犹豫地选择了JSON。尽管分析类似 CSV 的格式非常简单,但 JSON 提供了很大的灵活性,但需要一定的成本。

在花了一些时间探索 Spark 中 JSON 解析的各种选项后,我为此开发了一个 Scala 类,使用 Scala 解析库。在编程领域,有不止一种方法可以完成一项任务;即使对于JSON解析,许多库也可用,即Json4s、PlayJSON、喷雾JSON等。我将在后续文章中发布Scala探索的细节。

使用Scala解析JSON之后,我想尝试一下Python中的类似的东西。我发现JSON解析在Python中是微不足道的(基本上只有一个导入和一行代码)。

import json

str1 = '{ "name": "John Smith", "city": "New York", "id": 123, "numbers": [1, 2, 3, 4], "address": { "house": "43", "street": "privet drive" } }'
map = json.loads(str1)
print(map["name"], map["city"], map["address"])

由于我们有使简单事情变得复杂的习惯,我决定通过将 JSON 解析逻辑封装在名为 CustomJSON 的类中来达到预期。

import json

class CustomMap:
  def __init__(self):
    self.pmap = dict()

  def createFromJSON(self, jsonData):
    self.pmap = json.loads(jsonData)

  def createFromDict(self, data):
    self.pmap = data

  def getString(self, field, defVal=""):
    retVal = defVal
    try:
      retVal = str(self.pmap[field])
    except KeyError:
      retVal = defVal
    return retVal

  def getInt(self, field, defVal=0):
    retVal = defVal
    try:
      retVal = int(self.pmap[field])
    except KeyError:
      retVal = defVal
    return retVal

  def getFloat(self, field, defVal=0.0):
    retVal = defVal
    try:
      retVal = int(self.pmap[field])
    except KeyError:
      retVal = defVal
    return retVal

  def getList(self, field, defVal=[]):
    retVal = defVal
    try:
      retVal = self.pmap[field]
    except KeyError:
      retVal = defVal
    return retVal

  def getObject(self, field, defVal=None):
    retVal = defVal
    try:
      retVal = self.pmap[field]
    except KeyError:
      retVal = defVal
    return retVal

  def getObjectAsCustomMap(self, field, defVal=None):
    retVal = defVal
    try:
      val = self.pmap[field]
      print(val)
      ncm = CustomMap()
      if val != None:
        print("val is not null")
        ncm.createFromDict(val)
        retVal = ncm
    except KeyError:
      retVal = defVal
    return retVal
#end CustomMap

str1 = '{ "name": "John Smith", "city": "New York", "id": 123, "numbers": [1, 2, 3, 4], "address": { "house": "43", "street": "privet drive" } }'

cm = CustomMap()
cm

getString(”名称”,”xxx”))
打印(厘米.getInt(”id”,42))
打印(厘米.getInt(”id123″,42))
打印(厘米.getlist(”数字”))
打印(cm.getlist(”数字”)[0])
打印(厘米.getObject(”地址”))
打印(类型(厘米.getObject(”地址”))
ncm = cm.getObjectAs自定义地图(”地址”,无)
印刷品(ncm.getString(”房子”)

虽然您可能会嘲笑类,但类的主要好处是 KeyError 异常由类处理,从而使 JSON 解析在应用程序中更简单、更简洁。应用程序不再需要担心异常。

进一步阅读

Comments are closed.