C# 自定义行分隔符和json上的U-SQL自定义提取器
我有几个数据结构如下的文本文件:C# 自定义行分隔符和json上的U-SQL自定义提取器,c#,azure-data-lake,u-sql,C#,Azure Data Lake,U Sql,我有几个数据结构如下的文本文件: { huge json block that spans across multiple lines } --#newjson#-- { huge json block that spans across multiple lines } --#newjson#-- { huge json block that spans across multiple lines } etc.... 因此,实际上是json块由“--#####--”字符串行分隔。
{
huge
json
block that spans across multiple lines
}
--#newjson#--
{
huge
json
block that spans across multiple lines
}
--#newjson#--
{
huge
json
block that spans across multiple lines
} etc....
因此,实际上是json块由“--#####--”
字符串行分隔。
我正试图编写一个客户提取器来解析这个。问题是,我不能使用string
数据类型为json反序列化器提供数据,因为它的最大大小为128 KB,并且json块不适合此类型。使用自定义提取器解析此文件的最佳方法是什么
我尝试过使用下面的代码,但不起作用。即使是行分隔符--#newjson--“似乎也无法正常工作
public SampleExtractor(Encoding encoding, string row_delim = "--#newjson#--", char col_delim = ';')
{
this._encoding = ((encoding == null) ? Encoding.UTF8 : encoding);
this._row_delim = this._encoding.GetBytes(row_delim);
this._col_delim = col_delim;
}
public override IEnumerable<IRow> Extract(IUnstructuredReader input, IUpdatableRow output)
{
//Read the input by json
foreach (Stream current in input.Split(_encoding.GetBytes("--#newjson#--")))
{
var serializer = new JsonSerializer();
using (var sr = new StreamReader(current))
using (var jsonTextReader = new JsonTextReader(sr))
{
var jsonrow = serializer.Deserialize<JsonRow>(jsonTextReader);
output.Set(0, jsonrow.status.timestamp);
}
yield return output.AsReadOnly();
}
}
public SampleExtractor(编码编码,字符串行_delim=“-->newjson#--”,字符列_delim=”;)
{
这是._encoding=((encoding==null)?encoding.UTF8:encoding);
this.\u row\u delim=this.\u encoding.GetBytes(row\u delim);
这个;
}
公共重写IEnumerable Extract(IUnsttructureDrader输入,IUpdatableRow输出)
{
//通过json读取输入
foreach(input.Split(_encoding.GetBytes(-->newjson-->))中的当前流)
{
var serializer=new JsonSerializer();
使用(var sr=新的StreamReader(当前))
使用(var jsonTextReader=new jsonTextReader(sr))
{
var jsonrow=serializer.Deserialize(jsonTextReader);
Set(0,jsonrow.status.timestamp);
}
产生返回输出。AsReadOnly();
}
}
以下是实现解决方案的方法:
1) 创建JSON对象的c#等价物
注意:-假设文本文件中的所有json对象都相同。
例如:
Json代码
{
“id”:1,
“值”:“你好”,
“另一个价值观”:“世界”,
“价值目标”:{
“名称”:“obj1”
},
“价值清单”:[
1.
2.
3.
]
}
这样做不需要自定义提取器
最好的解决方案是逐行添加一个json。然后可以使用文本提取器逐行提取。您还可以选择自己的分隔符
REFERENCE ASSEMBLY [Newtonsoft.Json];
REFERENCE ASSEMBLY [Microsoft.Analytics.Samples.Formats];
@JsonLines=
EXTRACT
[JsonLine] string
FROM
@Full_Path
USING
Extractors.Text(delimiter:'\b', quoting : false);
@ParsedJSONLines =
SELECT
Microsoft.Analytics.Samples.Formats.Json.JsonFunctions.JsonTuple([JsonLine]) AS JSONLine
FROM
@JsonLines
@AccessToProperties=
SELECT
JSONLine["Property"] AS Property
FROM
@ParsedJSONLines;