在HDFS

时间:2017-06-18 10:30:23

标签: apache-spark hive hdfs

我的Spark工作每30分钟运行一次,并将输出写入hdfs - (/tmp/data/1497567600000)。我在集群中持续运行这项工作。

如何在此数据之上创建Hive表?我在StackOverFlow中看到了一个解决方案,它在日期字段分区的数据之上创建了一个hive表。就像,

 CREATE EXTERNAL TABLE `mydb.mytable`
 (`col1` string, 
  `col2` decimal(38,0), 
  `create_date` timestamp, 
  `update_date` timestamp)
  PARTITIONED BY (`my_date` string)
  STORED AS ORC
  LOCATION '/tmp/out/'

并且解决方案建议将表改为

ALTER TABLE mydb.mytable ADD PARTITION (my_date=20160101) LOCATION '/tmp/out/20160101'

但是,就我而言,我不知道如何编写输出目录,因此我显然无法按照上面的建议创建分区。

如何处理这种情况,输出目录是以时间戳为基础随机写入的,而不是格式(/tmp/data/timestamp= 1497567600000)?

如何让Hive选择目录/tmp/data下的数据?

1 个答案:

答案 0 :(得分:1)

我可以建议两种解决方案:

  • 如果您可以更改Spark工作,则可以按小时对数据进行分区(例如/tmp/data/1/tmp/data/2),每小时添加Hive分区,然后只写入相关分区
  • 你可以编写负责添加Hive分区的bash脚本,可以通过以下方式实现:
    • 使用命令hadoop fs -ls /tmp/data
    • 列出HDFS子目录
    • 使用命令列出表的hive分区:hive -e 'show partitions table;'
    • 比较上面的列表以查找丢失的分区
    • 使用上面提供的命令添加新的Hive分区:ALTER TABLE mydb.mytable ADD PARTITION (my_date=20160101) LOCATION '/tmp/out/20160101'