如何使用luigi将输出写入带有orc格式的分区表?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用luigi将输出写入带有orc格式的分区表?相关的知识,希望对你有一定的参考价值。

假设我们有这样的工作:

class MRjob(JobTask):
  def output(self):
    return ...

  def requires(self):
    return ...

  def mapper(self, line):
    # some line process
    yield key, (...information, stored in hashable type...)

  def reducer(self,key,values):
    # some reduce logic... for example this
    unique = set(values)
    for elem in unique:
      yield key, elem[0], elem[1] 

在输出方法中我应该怎么做才能将数据插入现有的表分区(表格也以orc格式存储)?我想跳过将数据转换为orc的过程,因此我尝试了

return HivePartitionTarget(self.insert_table, database=self.database_name, partition=partition)

但这没用。我还发现luigi试图将输出传递给某个文件。使用HivePartitionTarget,luigi返回错误,如'object has no attribute write',所以我的假设是HivePartitionTarget只是不包含write方法。因此,我认为我做错了,应该使用另一种方法,但没有设法找到一个例子

答案

关于如何在luigi实现这一点,我不太了解。我可能建议用简单的方法以正常分隔格式(例如逗号分隔格式)编写luigi脚本的输出。

在其上创建一个外部配置单元表:

CREATE EXTERNAL TABLE temp_table(
<col_name> <col_type>, 
<col_name2> <col_type>
.......
....... 
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ‘,’
LOCATION ‘ /hive/data/weatherext’;

使用简单的hive insert-into-select查询将数据插入原始表(具有ORC格式数据)。

INSERT INTO TABLE target_table
PARTITION( xxx )
SELECT 
COL_NAME1,
COL_NAME2
FROM temp_table;

您的目标表将具有ORC格式的数据,而hive将为您处理转换。

有关详细语法,请参阅https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DML#LanguageManualDML-InsertingdataintoHiveTablesfromqueries

以上是关于如何使用luigi将输出写入带有orc格式的分区表?的主要内容,如果未能解决你的问题,请参考以下文章

当vectorized.execution.enabled 使用带有Hive 的ORC 文件格式时发生ClassCastException

使用Hive SQL插入动态分区的Parquet表OOM异常分析

如何加载分区到 Hbase 表的 hive orc

Spark 结构化流写入流到 Hive ORC 分区外部表

分区的ORC表在Hive中显示为空

按时间戳写入分区数据