使用Apache Parquet在C#中将JSON转换为parquet格式

3

如何使用C#将来自mongo db源的json文件转换为Parquet文件?

我找到了一个名为Parquet.Net的库,但我需要更动态的东西。 我拥有的数据非常动态,很难在其中构建模式,如果您有解决此问题的方法,请告诉我。

  var file = File.ReadAllLines(@"C:\Users\NodeJS\Downloads\countries.json");
            List<object> tt = new List<object>();
            var fields = new HashSet<DataField>();

            foreach (var item in file)
            {

                var entity = JsonConvert.DeserializeObject<JObject>(item).ToObject<Dictionary<string, object>>();
                 foreach(var t in entity)
                {
                    fields.Add(new DataField(t.Key, t.Value.GetType()));
                        tt.Add(t.Value);
                }
            }

            var schema = new Schema(fields);

            using (Stream fileStream = System.IO.File.Create("convertJson.parquet"))
            {
                ParquetConvert.Serialize(tt, fileStream,schema);
            }

如果您对这个问题有解决办法,请告诉我。- 到底是什么问题的解决办法? - undefined
我有动态数据集,需要动态构建模式,以便将其解析为Parquet文件。你没有看到标题和我的描述吗? - undefined
是的,我看到了标题和描述,但没有一个具体问题的示例需要解决,只是说“我有的数据非常动态”和“构建模式很困难”。你需要做的是展示你的输入数据是什么样子的,它如何“动态”,你的输出数据应该是什么样子的,以及为什么迄今为止你尝试过的方法没有达到预期结果。 - undefined
我认为他的意思是,如果他/她得到一个非常动态的数据集,他不知道会得到什么样的数据,他使用反射来读取数据对象的字段名称,但是当他/她得到嵌套数组或者非原始数据类型的对象时,问题就变得更加复杂了,例如Person { Age:12, children:[{amount:1}, {school:true}]} 这种数据很难解析,他不知道对象将会有什么样的数据。我认为他解释得非常好,你不需要是个天才才能理解他在这里的意思! - undefined
1个回答

2
你可以考虑使用开源库Cinchoo ETL,它可以将JSON转换为Parquet文件。
安装Nuget包

install-package ChoETL.Parquet

示例代码

using ChoETL;

using (var r = new ChoJSONReader("*** Your JSON file ***"))
{
    using (var w = new ChoParquetWriter("*** Your parquet output file ***"))
    {
        w.Write(x);
    }
}

如需更多信息,请访问codeproject文章。

示例fiddle:https://dotnetfiddle.net/fIJIfM


我注意到它确实可以工作,但是用ChoETL从JSON创建的Parquet文件比在Python中使用pyarrow创建的文件要大得多。有什么办法可以缩小文件大小吗? - undefined
1
未选择压缩方法。在写入器上使用.Configure(c => c.CompressionMethod = Parquet.CompressionMethod.Gzip)来压缩输出。 - undefined
这个不是线程安全的,我该如何在并发线程中使用它? - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接