我在NSData上写了一个用libSnappy进行压缩的简短类别.它在压缩过程中就像一个魅力,但解压缩代码会产生SNAPPY_INVALID_INPUT.有趣的是,尽管Op-Code无效,但snappy仍然result用未压缩的数据填充我的缓冲区.有谁知道为什么snappy向我扔这个?
- (NSData*)dataBySnappyUncompression {
NSMutableData *result = nil;
if (self.bytes != NULL) {
size_t uncompress_result = 0;
snappy_status opCode = snappy_uncompressed_length(self.bytes, self.length, &uncompress_result);
if (opCode == SNAPPY_OK) {
result = [NSMutableData dataWithLength:uncompress_result];
opCode = snappy_uncompress(self.bytes, self.length, [result mutableBytes], &uncompress_result);
if (opCode == SNAPPY_OK) {
[result setLength:uncompress_result];
return result;
}
}
}
LEPLog(@"Failed snappy de-compress: tried to de-compress %lu bytes", self.length);
NSAssert(nil, @"Failed Snappy de-compress");
result = nil;
return result;
}
Run Code Online (Sandbox Code Playgroud)
我应该注意,正在压缩/未压缩的数据是NSKeyedArchiver调用的结果.
我有一个基于 avro 架构的配置单元表。该表是使用以下查询创建的
CREATE EXTERNAL TABLE datatbl
PARTITIONED BY (date String, int time)
ROW FORMAT SERDE
'org.apache.hadoop.hive.serde2.avro.AvroSerDe'
WITH SERDEPROPERTIES (
'avro.schema.url'='path to schema file on HDFS')
STORED as INPUTFORMAT
'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat'
LOCATION '<path on hdfs>'
到目前为止,我们一直通过设置以下属性向表中插入数据
hive> set hive.exec.compress.output=true;
hive> set avro.output.codec=snappy;
但是,如果有人忘记设置上述两个属性,则无法实现压缩。我想知道是否有一种方法可以强制对表本身进行压缩,以便即使未设置上述两个属性,数据也始终会被压缩?
好!所以我决定使用Parquet作为hive表的存储格式,在我实际在集群中实现之前,我决定运行一些测试.令人惊讶的是,Parquet在我的测试中速度较慢,因为它比普通文本文件更快.
请注意,我在MapR上使用Hive-0.13
遵循我的操作流程
表A.
格式 - 文本格式
表大小 - 2.5 Gb
表B.
格式 - 镶木地板
表大小 - 1.9 Gb
[创建表格B作为选择*从A存储为镶木地板]
表C.
格式 - 带有快速压缩的镶木地板
表大小 - 1.9 Gb
[创建表格C存储为镶木地板tblproperties("parquet.compression"="SNAPPY")作为select*from A]
现在我对上面提到的表进行了一些测试并遵循了细节.
表A.
地图 - 15
减少 - 1
累积CPU - 123.33秒
所需时间 - 59.057秒
表B.
地图 - 8
减少 - 1
累计CPU - 204.92秒
所需时间 - 50.33秒
表A.
地图 - 15
减少 - 0
累计CPU - 51.18秒
所需时间 - 25.296秒
表B.
地图 - 8
减少 - 0
累计CPU …
我在HDFS中有数据集,它采用镶木地板格式,并且有snappy作为压缩编解码器.就我的研究而言,目前Redshift只接受带有gzip,lzo压缩编解码器的纯文本,json,avro格式.
或者,我正在将镶木地板格式转换为纯文本,并使用Pig脚本将snappy编解码器更改为gzip.
目前有没有办法直接从镶木地板文件加载数据到Redshift?
我一直在 mongodb 中使用 WiredTiger 存储引擎的默认(snappy)压缩,并且我想切换到 zlib。但是,我的应用程序中已经有一些用户处于活动状态,并且数据库中有数据,我想确保以最小的中断进行此更改。默认情况似乎是简单地重新创建数据库,例如通过 mongodump 转储并使用 zlib 压缩选项恢复到新数据库,然后指向新数据库。如果我在没有用户处于活动状态时进行切换,那么这很可能会很好地完成任务,但我想知道是否有更好的方法来进行更改,例如实现与现有数据库?
如果它是有用的上下文,则对更好压缩的需求实际上只涉及部分数据。如果有一种方法可以仅为数据库中的某些文档切换到 zlib 压缩,那就太好了。另外,为了以防万一,我正在使用 perl MongoDB.pm。
PS 这是我第一次查询 stackoverflow。我已经寻找答案并尝试遵循适当的提问惯例,但如果我以错误的方式处理问题,请温和地教育我。:)
我尝试编译,测试和运行junit测试时出错.
我想使用DataFrames加载本地Avro文件,但我得到一个例外:
org.xerial.snappy.SnappyError: [FAILED_TO_LOAD_NATIVE_LIBRARY] null
Run Code Online (Sandbox Code Playgroud)
我根本不使用Cassandra,涉及的罐子的版本是:
<properties>
<!-- Generic properties -->
<java.version>1.7</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<!-- Dependency versions -->
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<scala.version>2.10.4</scala.version>
<junit.version>4.11</junit.version>
<slf4j.version>1.7.12</slf4j.version>
<spark.version>1.5.0-cdh5.5.2</spark.version>
<databricks.version>1.5.0</databricks.version>
<json4s-native.version>3.5.0</json4s-native.version>
<spark-avro.version>2.0.1</spark-avro.version>
</properties>
Run Code Online (Sandbox Code Playgroud)
这些是依赖项:
<dependencies>
<dependency>
<groupId>org.json4s</groupId>
<artifactId>json4s-native_2.10</artifactId>
<version>${json4s-native.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.10</artifactId>
<version>${spark.version}</version>
</dependency>
<dependency>
<groupId>com.databricks</groupId>
<artifactId>spark-csv_2.10</artifactId>
<version>${databricks.version}</version>
<exclusions>
<exclusion>
<groupId>org.xerial.snappy</groupId>
<artifactId>snappy-java</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.xerial.snappy</groupId>
<artifactId>snappy-java</artifactId>
<version>1.0.4.1</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.databricks</groupId>
<artifactId>spark-avro_2.10</artifactId>
<version>${spark-avro.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
Run Code Online (Sandbox Code Playgroud)
我试图用这个项目编译
mvn clean …
我正在尝试使用 Snappy 压缩在 Apache Beam 中编写一个镶木地板文件,如下所示
records.apply(FileIO.<GenericRecord>write().via(ParquetIO.sink(schema)).to(options.getOutput()));
Run Code Online (Sandbox Code Playgroud)
我发现可以将AUTO、GZIP、BZIP2和设置为压缩,但我无法找到将其设置为 的方法,有什么想法如何做到这一点ZIP?作为参考,可以使用 wrting 到 avro,如下所示DEFLATESNAPPY
records.apply("writeAvro", AvroIO.writeGenericRecords(schema).withCodec(CodecFactory.snappyCodec()).to(options.getOutput()));
Run Code Online (Sandbox Code Playgroud) 我有扩展名为 .snappy.parquet 的文件,需要将其读入 Jupyter 笔记本,并将其转换为 pandas 数据帧。
import numpy
import pyarrow.parquet as pq
filename = "part-00000-tid-2430471264870034304-5b82f32f-de64-40fb-86c0-fb7df2558985-1598426-1-c000.snappy.parquet"
df = pq.read_table(filename).to_pandas()
Run Code Online (Sandbox Code Playgroud)
错误是:
ArrowNotImplementedError:不支持具有结构的列表
将 sortWithinPartitions 应用于 df 并将输出写入表后,我得到了一个结果,但我不知道如何解释。
df
.select($"type", $"id", $"time")
.sortWithinPartitions($"type", $"id", $"time")
Run Code Online (Sandbox Code Playgroud)
结果文件看起来有点像
1 a 5
2 b 1
1 a 6
2 b 2
1 a 7
2 b 3
1 a 8
2 b 4
Run Code Online (Sandbox Code Playgroud)
它实际上不是随机的,但也不像我期望的那样排序。即,首先按类型,然后是 id,然后是时间。如果我尝试在排序之前使用重新分区,那么我会得到我想要的结果。但由于某种原因,文件的重量增加了 5 倍(100GB 与 20GB)。
我正在向 hive orc 表写入数据,并将压缩设置为 snappy。
有谁知道为什么它是这样排序的,以及为什么重新分区会得到正确的顺序,但尺寸更大?
使用火花2.2。
我有一个 spark 作业,它使用 snappy 压缩将数据写入镶木地板文件。parquet 中的一列是重复的 INT64。
当从带有 parquet 1.8.2 的 spark 2.2 升级到带有 parquet 1.10.1 的 spark 3.1.1 时,我目睹了压缩比的严重下降。
例如,对于这个文件(用 spark 2.2 保存),我有以下元数据:
creator: parquet-mr version 1.8.2 (build c6522788629e590a53eb79874b95f6c3ff11f16c)
extra: org.apache.spark.sql.parquet.row.metadata = {"type":"struct","fields":[{"name":"numbers","type":{"type":"array","elementType":"long","containsNull":true},"nullable":true,"metadata":{}}]}
file schema: spark_schema
--------------------------------------------------------------------------------
numbers: OPTIONAL F:1
.list: REPEATED F:1
..element: OPTIONAL INT64 R:1 D:3
row group 1: RC:186226 TS:163626010 OFFSET:4
--------------------------------------------------------------------------------
numbers:
.list:
..element: INT64 SNAPPY DO:0 FPO:4 SZ:79747617/163626010/2.05 VC:87158527 ENC:RLE,PLAIN_DICTIONARY ST:[min: 4, max: 1967324, num_nulls: 39883]
Run Code Online (Sandbox Code Playgroud)
使用 spark 3.1 读取并再次保存为 parquet,我得到以下元数据,并且 parquet …