hive数据的追加(不同文件格式或压缩方式 文件)

1 首先根据文件格式新建一个特定切分的表
如果数据是以tab键 分割时
新建表
CREATE EXTERNAL TABLE tmp.ods_test(
id bigint,
amount double,
available_interest double,
)
row format delimited fields terminated by ‘\t’ stored as textFile
LOCATION ‘hdfs://we-hdfs/home/hdfs/zhaolcDev/finance_test.txt’

采用 insert into 的方式 将数据插入不同格式表中
INSERT INTO TABLE ods.ods_log partition (dt=‘2019-01-29’)
select * FROM tmp.ods_test;

注意
1.:目标表为lzo 等压缩格式时 设置压缩方式
即为:
SET hive.exec.compress.output=true;
SET mapred.output.compression.codec=com.hadoop.compression.lzo.LzopCodec;
INSERT INTO TABLE ods.ods_log partition (dt=‘2019-01-29’)
select * FROM tmp.ods_test;

2、线上操作时:本人建议新建一个分区 将数据先写入分区中,让后将location 路径下的文件(可能是lzo压缩文件)拷贝到缺失数据的分区路径下 避免污染数据
INSERT INTO TABLE ods.ods_log partition (dt=‘2019-01-29’)
select * FROM tmp.ods_test;

3、insert overwrite table 和 INSERT INTO TABLE一个数数据重写(旧数据会被删除)另一个数数据追加。

修改 表的压缩方式
ALTER TABLE ods_log
SET FILEFORMAT
INPUTFORMAT “com.hadoop.mapred.DeprecatedLzoTextInputFormat”
OUTPUTFORMAT “org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat”;

lzo结构表数据 查询时使用count(*)有数据,但是select * 是没有数据的

说明已将 LZO压缩过的表数据导入一个没有被压缩过表内,建议数据重新导入

也可以通过
SET hive.exec.compress.output=true;
SET mapred.output.compression.codec=com.hadoop.compression.lzo.LzopCodec;
设置压缩方式查询

<think>我们参考上述引用内容,尤其是引用[4]提到了在SparkSQL中保存Hive时的压缩设置,其中涉及几个配置参数:1.`mapreduce.output.fileoutputformat.compress`:是否启用压缩("true""false")2.`mapreduce.output.fileoutputformat.compress.codec`:指定压缩编解码器的类名,例如:对于Gzip压缩,使用"org.apache.hadoop.io.compress.GzipCodec"3.`mapreduce.output.fileoutputformat.compress.type`:压缩类型(例如,对于SequenceFile的压缩类型可以是RECORDBLOCK,但对于其他文件格式可能不同)另外,引用[2]提到,实际开发中Hive存储格式一般选择ORCParquet,压缩方式选择Snappy、LZO等。因此,在Spark中创建Hive并指定压缩格式,我们通常需要做两件事:1.设置的存储格式(如ORC、Parquet等)2.设置压缩相关的属性(如压缩编解码器)注意:压缩格式的指定通常是通过在SparkSQL中设置Hadoop的配置属性来完成的。具体步骤:1.在创建时,使用`USING`子句指定存储格式(例如:`ORC`、`PARQUET`)。2.通过设置属性(TBLPROPERTIES)来指定压缩编解码器,者使用`CREATETABLE`语句的`OPTIONS`(在Spark中可能是`USING`后的子句`OPTIONS`)来设置,但更常见的是通过设置Hadoop配置属性。另外,我们也可以在Spark会话中设置全局的压缩配置,这样在写入时就会使用这些配置。示例(使用SparkSQL):方法一:在创建语句中设置TBLPROPERTIES```sqlCREATETABLEmy_table(idINT,nameSTRING)USINGORCTBLPROPERTIES('orc.compress'='SNAPPY');```对于Parquet格式:```sqlCREATETABLEmy_table(idINT,nameSTRING)USINGPARQUETTBLPROPERTIES('parquet.compression'='SNAPPY');```方法二:在写入数据前,通过设置Spark的配置(这种方式会影响整个作业的写入):在Spark中,我们可以在SparkSession上设置配置:```scalaspark.conf.set("spark.sql.parquet.compression.codec","snappy")//者对于ORCspark.conf.set("spark.sql.orc.compression.codec","snappy")```然后创建(在Spark中,创建空可能不需要写入数据,但如果是通过`saveAsTable`写入数据,则会使用上述设置的压缩格式)注意:引用[4]中提到的配置名称是针对MapReduce的,在Spark中我们通常使用Spark的配置属性属性(取决于具体格式)。对于ORC和Parquet,Spark支持通过特定的配置属性来设置压缩格式。另外,对于文本格式(TEXTFILE)的,我们可以通过设置Hadoop的压缩配置来指定,例如:```scalaspark.conf.set("mapreduce.output.fileoutputformat.compress","true")spark.conf.set("mapreduce.output.fileoutputformat.compress.codec","org.apache.hadoop.io.compress.SnappyCodec")```但是,对于Hive,更推荐使用列式存储格式(如ORCParquet)以获得更好的性能。总结步骤:1.确定存储格式(如ORCParquet)。2.根据存储格式确定如何设置压缩:-ORC:通过`orc.compress`属性(在TBLPROPERTIES中设置)者全局设置`spark.sql.orc.compression.codec`。-Parquet:通过`parquet.compression`属性(在TBLPROPERTIES中设置)者全局设置`spark.sql.parquet.compression.codec`。3.创建。需要注意的是,创建方式有多种(比如使用SparkSQL的CREATETABLE语句,者使用DataFrame的saveAsTable方法),不同方式设置压缩的方法可能略有不同。示例使用DataFrameAPI创建并指定压缩格式(以Parquet格式和Snappy压缩为例):```scala//设置全局的压缩配置spark.conf.set("spark.sql.parquet.compression.codec","snappy")//者,在写入时单独设置(这里saveAsTable可能使用全局设置,也可以通过option传递,但具体取决于版本)valdata=Seq((1,"Alice"),(2,"Bob")).toDF("id","name")data.write.format("parquet").option("compression","snappy")//显式指定压缩格式.saveAsTable("my_table")```对于ORC格式,类似:```scaladata.write.format("orc").option("compression","snappy").saveAsTable("my_table")```者通过全局配置:```scalaspark.conf.set("spark.sql.orc.compression.codec","snappy")data.write.format("orc").saveAsTable("my_table")```引用文章提到,压缩格式的选择需要权衡压缩率和速度。Snappy提供较快的压缩和解压缩速度,但压缩率较低;而Gzip压缩率较高,但速度较慢。根据实际需求选择。参考文献:[^1]介绍了Hive的各种存储格式和压缩方式。[^2]建议选择ORCParquet作为存储格式,并选择SnappyLZO压缩方式。[^3]强调了压缩在节省存储和网络带宽方面的重要性,但也指出了压缩和解压缩需要消耗计算资源。[^4]提供了在SparkSQL中设置压缩的相关配置项。因此,用户在使用Spark创建Hive时,可以根据上述方法指定压缩格式。注意:具体压缩格式的支持取决于Hadoop集群上安装的编解码器。例如,Snappy和LZO可能需要额外的安装和配置。最后,我们提供相关问题:</think> ### 在 Spark 中创建 Hive 并指定压缩格式的方法 在 Spark 中创建 Hive 时指定压缩格式(如 Snappy、Gzip),主要涉及 **存储格式选择** 和 **压缩参数配置** 两个关键步骤。以下是具体实现方法: --- #### **方法 1:通过 Spark SQL 语句指定** 在 `CREATE TABLE` 语句中直接定义压缩格式(适用于 ORC/Parquet 格式): ```sql -- ORC 格式 + Snappy 压缩 CREATE TABLE my_table ( id INT, name STRING ) STORED AS ORC TBLPROPERTIES ("orc.compress"="SNAPPY"); -- Parquet 格式 + Gzip 压缩 CREATE TABLE my_table ( id INT, name STRING ) STORED AS PARQUET TBLPROPERTIES ("parquet.compression"="GZIP"); ``` > **关键参数**: > - `orc.compress`:ORC 压缩算法(可选 SNAPPY/ZLIB/GZIP) > - `parquet.compression`:Parquet 压缩算法(可选 SNAPPY/GZIP/LZO) --- #### **方法 2:通过 DataFrame API 指定** 使用 `df.write` 写入数据时配置压缩参数: ```scala val data = Seq((1, "Alice"), (2, "Bob")).toDF("id", "name") // 写入 ORC + Snappy data.write .format("orc") .option("orc.compress", "SNAPPY") .saveAsTable("orc_snappy_table") // 写入 Parquet + Gzip data.write .format("parquet") .option("compression", "GZIP") .saveAsTable("parquet_gzip_table") ``` --- #### **方法 3:全局配置压缩(推荐)** 在 Spark Session 中统一设置默认压缩格式: ```scala // 设置 ORC 默认压缩为 Snappy spark.conf.set("spark.sql.orc.compression.codec", "snappy") // 设置 Parquet 默认压缩为 Gzip spark.conf.set("spark.sql.parquet.compression.codec", "gzip") ``` 此后所有通过 Spark 创建的 ORC/Parquet 将自动应用该压缩。 --- ### **关键注意事项** 1. **格式与压缩兼容性** - ORC 支持:ZLIB/SNAPPY/GZIP - Parquet 支持:SNAPPY/GZIP/LZO - TextFile 需额外配置(如下示例) ```sql CREATE TABLE text_table (...) STORED AS TEXTFILE TBLPROPERTIES ( "mapreduce.output.fileoutputformat.compress"="true", "mapreduce.output.fileoutputformat.compress.codec"="org.apache.hadoop.io.compress.GzipCodec" ); ``` 2. **性能权衡** - 高压缩率:GZIP(CPU 开销大) - 高效率:SNAPPY(压缩率较低) > ORC/Parquet 格式建议优先用 Snappy[^2] 3. **数据写入场景** - 追加数据时需确保压缩格式一致: ```scala df.write.mode("append").format("parquet").option("compression", "SNAPPY")... ``` --- ### **压缩效果对比** | 压缩格式 | 压缩速率 | 压缩率 | 是否支持分片 | |---------|---------|-------|------------| | **Snappy** | ⭐⭐⭐⭐ | ⭐⭐ | ❌ | | **Gzip** | ⭐⭐ | ⭐⭐⭐⭐ | ❌ | | **LZO** | ⭐⭐⭐ | ⭐⭐⭐ | ✅(需建索引)| > 注:压缩格式需与存储格式配合使用(如 ORC+Snappy)[^1][^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值