我正在尝试将JSON文件转换为csv,以提取感兴趣的某些特定键/值。我有大型文本文件(>一百万行),其中每一行都是一个JSON对象。实际的结构是嵌套的,并且包含数组,但是对于这个问题来说并不重要。
示例文件:
{"param1": val00, "param2": val01}
{"param1": val10, "param2": val11}
...
{"param1": valn0, "param2": valn1}
我将以下代码与Text Extractor结合使用,以将每行转换为JSON对象,然后使用JsonFunctions.JsonTuple()解析JSON对象
REFERENCE ASSEMBLY DdaAdlDb.[Newtonsoft.Json];
REFERENCE ASSEMBLY DdaAdlDb.[Microsoft.Analytics.Samples.Formats];
USING Microsoft.Analytics.Samples.Formats.Json;
@RawExtract =
EXTRACT RawString string
FROM @InputFile
USING Extractors.Text(delimiter:'\b', quoting:false);
@json =
SELECT JsonFunctions.JsonTuple(RawString, "..*") AS RootObject
FROM @RawExtract;
我遇到了问题,因为至少其中一行损坏,如下所示:
{"param1": val00, "param2"{"param1": val10, "param2": val11}
...
{"param1": valn0, "param2": valn1}
这些是我收到的错误消息
VertexFailedFast:顶点失败,并出现快速失败错误 E_RUNTIME_USER_EXPRESSIONEVALUATION 计算表达式Microsoft.Analytics.Samples.Formats.Json.JsonFunctions.JsonTuple(RawString,“ .. *”)时出错 用户表达式的内部异常:解析值后,遇到意外字符:{。
====在Newton.Json.Linq.JContainer.ReadContentFrom(JsonReader r, Newtonsoft.Json.Linq.JContainer.ReadTokenFrom(JsonReader阅读器,JsonLoadSettings选项)的Newtonsoft.Json.Linq.JObject.Load(JsonReader阅读器,JsonLoadSettings设置)的Newtonsoft.Json.Linq.JToken.ReadFrom(JsonReader的JsonLoadSettings设置) ,在Microsoft.Analytics.Samples.Formats.Json.JsonFunctions.JsonTuple [T](String json,String [] path)在Newtonsoft.Json.Linq.JToken.Parse(String json,JsonLoadSettings settings)处。位于d:\ data \ yarnnm \ local \中的 _Scope_Generated_Classes _ .SqlFilterTransformer_13.Process(IRow inRow,IUpdatableRow outRow)上的Analytics.Samples.Formats.Json.JsonFunctions.JsonTuple(String json,String []路径) usercache \ 45905a29-60cf-4dd2-bf9c-c2b31bedea60 \ appcache \ appl ication_1546207842059_5159256 \ container_e346_1546207842059_5159256_01_000001 \ wd__ScopeCodeGen __。dll.cs:第233行
我不介意输掉几行。我看到对于提取器,我可以使用silent: true
来忽略不良行。 JsonFunctions.JsonTuple()
解析功能是否有类似的选择?
答案 0 :(得分:1)
可以在U-SQL脚本中创建一个try-catch块,以避免在JsonReaderException
上崩溃。
尝试捕获块
// Ignore rows with invalid JSON formattting
DECLARE @TryParseJson Func<string, SqlMap<string, string>> = (RawString)=>{
try
{
return JsonFunctions.JsonTuple(RawString, "..*");
}
catch (Newtonsoft.Json.JsonReaderException e)
{
return null; // Consider returning empty SqlMap<string, string> instead
}
};
提取并解析JSON
每行包含一个JSON字符串
@RawExtract =
EXTRACT RawString string
FROM @InputFile
USING Extractors.Text(delimiter:'\b', quoting:false);
@json =
SELECT @TryParseJson(RawString) AS RootObject
FROM @RawExtract;
忽略具有无效JSON(空值)的行
@result =
SELECT RootObject["id"] AS Id
, RootObject["status"] AS Status
, RootObject["time"] AS Time
FROM @json
WHERE RootObject != null; // Ignore invalid JSON
答案 1 :(得分:0)
JsonTuple没有类似的选项。
我看到2种解决该问题的方法。