Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用C访问Avro.snz文件中的数据#_C#_Avro_Snappy_Spark Avro - Fatal编程技术网

C# 如何使用C访问Avro.snz文件中的数据#

C# 如何使用C访问Avro.snz文件中的数据#,c#,avro,snappy,spark-avro,C#,Avro,Snappy,Spark Avro,我有一个Avro.snz文件 avro.codecs很快 这可以通过Spark中的com.databricks.avro打开,但Apache.avro和Confluent.avro似乎不支持snappy,它们只有deflate和null。虽然他们可以给我模式,但我无法得到数据 下一个方法获取错误。Ironsnappy也无法解压缩该文件,它说输入是错误的 using (Avro.File.IFileReader<generic> reader = Avro.File.DataFileR

我有一个Avro.snz文件 avro.codecs很快 这可以通过Spark中的com.databricks.avro打开,但Apache.avro和Confluent.avro似乎不支持snappy,它们只有deflate和null。虽然他们可以给我模式,但我无法得到数据

下一个方法获取错误。Ironsnappy也无法解压缩该文件,它说输入是错误的

using (Avro.File.IFileReader<generic> reader = Avro.File.DataFileReader<generic>.OpenReader(avro_path))
{
    schema = reader.GetSchema();
    Console.WriteLine(reader.HasNext()); //true
    var hi = reader.Next(); // error
    Console.WriteLine(hi.ElementAt(0).ToString()); // error
}
使用(Avro.File.IFileReader reader=Avro.File.DataFileReader.OpenReader(Avro_路径))
{
schema=reader.GetSchema();
Console.WriteLine(reader.HasNext());//true
var hi=reader.Next();//错误
Console.WriteLine(hi.ElementAt(0.ToString());//错误
}
我开始怀疑Azure HDInsight库中是否有任何内容,但我似乎找不到nuget软件包,它为我提供了一种阅读支持Snappy压缩的Avro的方法

我对任何解决方案都持开放态度,即使这意味着下载Apache.Avro的源代码并手动添加Snappy支持,但老实说,我是一个新手,甚至不知道压缩是如何工作的,更不用说添加对库的支持了

有人能帮忙吗

更新: 只是将snappy编解码器添加到Apache.Avro并将DeflateStream更改为Ironsnappy流失败。它再次提供了损坏的输入。是否有任何地方可以用C#打开Snappy压缩的Avro文件


或者,我如何确定Avro的哪个部分是snappy压缩的,并将其传递给Ironsnappy。

好的,所以对此没有任何评论。但我最终解决了我的问题。下面是我如何解决它的

  • 我也尝试了Apache.Avro和Confluent版本,但是他们的.net版本没有快速的支持。但是我可以得到模式,因为它显然是未压缩的
  • 由于Parquet.Net使用IronSnappy,我在Apache.Avro中构建/添加了snappy编解码器,基本上是克隆了它的deflate代码并更改了几个名称。失败。腐败的输入Ironsnappy说
  • 我研究了Avro,发现它是由一个未压缩的模式分隔的,后面是数据的压缩编解码器的名称,然后是数据本身,它们被划分为块。我不知道一个街区的起点和终点。文件中的二进制文件以某种方式提供了该信息,但我仍然不知道,我甚至不能用十六进制编辑器获得它。我认为Apache.Avro不知何故需要很长的时间或变化,而我使用的十六进制编辑器并没有提供这些信息
  • 我在Apache.avro中找到了avro-tools.jar工具。为了使它更易于使用,我使用launch4j将其作为一个可执行文件,这完全是多余的移动,但不管怎样。然后我用那只猫把我的avro压缩成一行,没有压缩,很快。我使用它作为基础,并在调试器中遵循Apache.Avro的流程。同时使用十六进制编辑器和C#中的调试器跟踪字节索引等
  • 对于1行,保证1个块。所以我在字节开始索引和结束索引上运行了一个循环。我找到了我的Snappy块,并能够用IronSnappy解压它。我修改了Apache.Avro snappy编解码器代码的编解码器部分,使其能够使用1个块。(这基本上是Apache.Avro占用的减去4字节的块,我假设这是我忽略的Snappy CRC检查
  • 它在多块的情况下失败。我找到了它的原因,因为Apache.Avro总是在第一个块之后抛出一个4096字节的deflate编解码器数组。我将其减小为读取大小,并再次执行大小为负4的操作。它成功了
  • 成功!所以基本上它是复制到deflate作为snappy的模板,将块字节减少4,然后确保在让Ironsnappy解压之前将字节数组调整为块字节大小

    public override byte[] Decompress(byte[] compressedData)
    {
                int snappySize = compressedData.Length - 4;
                byte[] compressedSnappy_Data = new byte[snappySize];
                System.Array.Copy(compressedData, compressedSnappy_Data, snappySize);
    
                byte[] result = IronSnappy.Snappy.Decode(compressedSnappy_Data);
                return result;
    }
    
    我不知道如何使用校验和,也不需要使用校验和,至少现在不行。我完全忽略了压缩函数

    但是如果你真的想要我的压缩函数,它就在这里

            public override byte[] Compress(byte[] uncompressedData)
            {
                return new byte[0];
            }
    

    好的,甚至没有任何评论。但我最终解决了我的问题。以下是我如何解决的

  • 我也尝试了Apache.Avro和Confluent版本,但是他们的.net版本没有snappy支持。但是我可以得到模式,因为它显然是未压缩的
  • 由于Parquet.Net使用IronSnappy,我在Apache.Avro中构建/添加了snappy编解码器,基本上是克隆了它的deflate代码并更改了几个名称。失败。IronSnappy说输入损坏
  • 我研究了Avro,发现它是由一个未压缩的模式分开的,后面是数据的压缩编解码器的名称,然后是数据本身,分为块。我不知道块从哪里开始和结束。不知怎么的,文件中的二进制文件以某种方式提供了信息,但我仍然不知道,我无法用he获得它甚至是x编辑器。我认为Apache.Avro需要很长的时间或是某种变化,而我使用的十六进制编辑器并没有提供这些信息
  • 我在Apache.avro中找到了avro-tools.jar工具。为了使它更易于使用,我使用launch4j将其作为一个可执行文件,这完全是多余的移动,但不管怎样。然后,我将我的avro压缩为一行,未压缩且快速。我使用它作为基础,并在调试器中遵循Apache.avro的流程。同时还跟踪字节索引等使用C#中的十六进制编辑器和调试器
  • 对于1行,保证1个块。因此,我在字节开始索引和结束索引上运行了一个循环。我找到了我的Snappy块,并能够使用IronSnappy对其进行解压缩。我修改了Apache.Avro Snappy编解码器代码的编解码器部分,使其能够与1个块一起工作。(这基本上是Apache.Avro占用的减去4字节的块,我假设这是我忽略的Snappy CRC检查
  • 它在多块的情况下失败。我找到了它的原因,因为Apache.Avro总是在第一个块之后抛出一个4096字节的deflate编解码器数组。我将其减小为读取大小,并再次执行大小为负4的操作。它成功了
  • 成功!所以基本上它是作为snappy的模板复制over deflate,将块字节减少4,然后确保将字节数组的大小调整为bl
            public override byte[] Compress(byte[] uncompressedData)
            {
                return new byte[0];
            }
    
    ResultModel resultObject = AvroConvert.Deserialize<ResultModel>(byte[] avroObject);