小编jig*_*hah的帖子

蜂巢中的增量/增量负载

我有下面的用例:

我的应用程序在RDBMS DB中有一个包含多年数据的表.我们已经使用sqoop将数据导入HDFS并加载到按划分的hive表中.

现在,应用程序更新,并且每天也将新记录插入到RDBMS表格表中.这些更新的记录可以跨越历史月份.更新的记录和新的插入记录可以通过更新的时间戳字段确定(它将具有当前日期时间戳).

现在问题是:如何使用这些更新的记录每天执行delta/incremental load hive表.

- >我知道有一个sqoop功能允许增量导入.但是,只有新的增量导入对我们来说还不够.

因为 -

- >我不能直接在hive表中插入这些记录(使用insert into),因为它会导致重复的记录(更新的记录).

- >同样的方法我不能使用insert overwrite语句,因为这些只是更新并插入跨越多个月的记录.插入覆盖将删除先前的记录.

当然,最简单的选择是每天使用sqoop获取完整数据,但我们不希望这样做,因为数据量很大.

因此,基本上我们只想完全加载我们已收到更新/插入记录的分区.

我们愿意在hive或sqoop端探索选项.你能告诉我们吗?

提前致谢.

hadoop hive sqoop hiveql

6
推荐指数
1
解决办法
2万
查看次数

Scala字符串变量替换

我有用scala编写的spark代码.Spark读取存储要执行的SQL的元表(已在spark中作为临时表).

我面临的问题是我们有使用变量的查询(在scala代码中定义)

我尝试了不同的方法,但我无法用变量替换变量.

var begindate= s"2017-01-01";
var enddate =  s"2017-01-05";

Msg.print_info(s"begin processing from ${beginDate} to ${endDate}");


//Reading SQL from MetaData table stored in spark as meta_table (temp table)

val dynamic_read_sql = s"""
        select SQL_TEXT
        from meta_table""";

val dynamic_sql_query = sqlContext.sql(dynamic_read_sql);
val check_query = dynamic_sql_query.first().getString(0);

Msg.print_info(s"check_query = $check_query");
Run Code Online (Sandbox Code Playgroud)

我正在正确显示sql.

// date is also temp table in spark
select * from date where load_date >= '${begindate}' and load_date <='${enddate}'
Run Code Online (Sandbox Code Playgroud)

下一步是执行这个sql

dynamic_sql_find = sqlContext.sql(check_query);
Run Code Online (Sandbox Code Playgroud)

但它无法替换已经在代码中定义的'$ {begindate}'和'$ {enddate}'.因此,返回0记录.

我试图将商店存储在另一个变量中.

val replace_check_query = s"${check_query}"
Run Code Online (Sandbox Code Playgroud)

但是,它没有取代变量. …

scala apache-spark apache-spark-sql spark-dataframe

3
推荐指数
2
解决办法
1773
查看次数

Hive数据根据时间戳选择最新值

我有一个包含以下列的表.

C1,C2,Process TimeStamp,InsertDateTimeStamp
p1,v1,2014-01-30 12:15:23,2013-10-01 05:34:23 
p1,v2,2014-01-31 05:11:34,2013-12-01 06:12:31 
p1,v3,2014-01-31 07:16:05,2012-09-01 07:45:20 
p2,v4,2014-02-01 09:22:52,2013-12-01 06:12:31 
p2,v5,2014-02-01 09:22:52,2012-09-01 07:45:20
Run Code Online (Sandbox Code Playgroud)

现在,我想基于最新的每个主键获取唯一行Process TimeStamp.

如果Process TimeStamp相同InsertDateTimeStamp则应选择具有最新的行.

所以,我的结果应该是.

p1,v3,2014-01-31 07:16:05,2012-09-01 07:45:20 
p2,v4,2014-02-01 09:22:52,2013-12-01 06:12:31
Run Code Online (Sandbox Code Playgroud)

如何通过HiveQL实现这一目标?

我目前正在使用hive 0.10.我不能将子查询与IN或EXISTS一起使用.

谢谢.

hive hiveql

2
推荐指数
2
解决办法
6737
查看次数

字符串映射转换配置单元

我有一个有四列的表.

C1    C2    C3    C4
--------------------
x1    y1    z1    d1
x2    y2    z2    d2
Run Code Online (Sandbox Code Playgroud)

现在我想将它转换为具有键和值对的地图数据类型并加载到单独的表中.

create table test
(
   level map<string,string>
)
row format delimited
COLLECTION ITEMS TERMINATED BY '&'
map keys terminated by '=';
Run Code Online (Sandbox Code Playgroud)

现在我在sql下面使用加载数据.

insert overwrite table test
select str_to_map(concat('level1=',c1,'&','level2=',c2,'&','level3=',c3,'&','level4=',c4) from input;
Run Code Online (Sandbox Code Playgroud)

在表格上选择查询.

select * from test;
{"level1":"x1","level2":"y1","level3":"z1","level4":"d1=\\"}
{"level1":"x2","level2":"y2","level3":"z2","level4":"d2=\\"}
Run Code Online (Sandbox Code Playgroud)

我没理解为什么我在最后一个值中得到额外的"=\\".

我仔细检查数据,但问题仍然存在.

你能帮忙吗?

hadoop hive map

0
推荐指数
1
解决办法
1万
查看次数