如何检查JSON文件是否已损坏,如缺少{,},逗号或错误的数据类型。我试图通过使用累加器来实现,因为进程在多个执行程序上运行。
{"name":"Standards1","id":90,"status":true}
{"name":"Standards2","id":91
{"name":"Standards3","id":92,"status":true}
{"name":781,"id":93,"status":true}
这是损坏的JSON文件 -
chunks
答案 0 :(得分:0)
我玩了这个游戏并想出了以下内容。
在2个解决方案中,我认为计数的差异会更快,因为它将使用本机Spark JSON处理。
UDF解决方案将在Python中进行JSON解析,这意味着您必须支付将每个文件行从Java传输到Python的成本,因此可能会更慢。
import json
from pyspark import SparkConf
from pyspark.sql import SparkSession
from pyspark.sql.functions import sum, udf
from pyspark.sql.types import LongType
application_name = 'Count bad JSON lines'
spark_config = SparkConf().setAppName(application_name)
ss = SparkSession.builder.config(conf=spark_config).getOrCreate()
# Difference of counts solution
input_path = '/baddata.json'
total_lines = ss.read.text(input_path).count()
good_lines = ss.read.option('mode', 'DROPMALFORMED').json(input_path).count()
bad_lines = total_lines - good_lines
print('Found {} bad JSON lines in data'.format(bad_lines))
# Parse JSON with UDF solution
def is_bad(line):
try:
json.loads(line)
return 0
except ValueError:
return 1
is_bad_udf = udf(is_bad, LongType())
lines = ss.read.text(input_path)
bad_sum = lines.select(sum(is_bad_udf('value'))).collect()[0][0]
print('Got {} bad lines'.format(bad_sum))
ss.stop()