我最近完成了两个资产的写作 –基于 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 解析在应用程序中更简单、更简洁。应用程序不再需要担心异常。