这是Hive中的第一个表 - 它包含有关我们正在购买的项目的信息.
CREATE EXTERNAL TABLE IF NOT EXISTS Table1 (This is the MAIN table through which comparisons need to be made)
(
ITEM_ID BIGINT,
CREATED_TIME STRING,
BUYER_ID BIGINT
)
Run Code Online (Sandbox Code Playgroud)
这是上面第一个表格中的数据
**ITEM_ID** **CREATED_TIME** **BUYER_ID**
220003038067 2012-06-21 1015826235
300003861266 2012-06-21 1015826235
140002997245 2012-06-14 1015826235
200002448035 2012-06-08 1015826235
260003553381 2012-06-07 1015826235
Run Code Online (Sandbox Code Playgroud)
这是Hive中的第二个表 - 它还包含有关我们正在购买的项目的信息.
CREATE EXTERNAL TABLE IF NOT EXISTS Table2
(
USER_ID BIGINT,
PURCHASED_ITEM ARRAY<STRUCT<PRODUCT_ID: BIGINT,TIMESTAMPS:STRING>>
)
Run Code Online (Sandbox Code Playgroud)
这是上表中的数据 -
**USER_ID** **PURCHASED_ITEM**
1015826235 [{"product_id":220003038067,"timestamps":"1340321132000"}, {"product_id":300003861266,"timestamps":"1340271857000"}, {"product_id":140002997245,"timestamps":"1339694926000"}, {"product_id":200002448035,"timestamps":"1339172659000"}, {"product_id":260003553381,"timestamps":"1339072514000"}]
Run Code Online (Sandbox Code Playgroud)
我已将数据减少到只有一个BUYER_ID(USER_ID),以使问题易于理解.
问题陈述-
我需要比较Table2 …
我正在使用Hive,我的表格结构如下:
CREATE TABLE t1 (
id INT,
created TIMESTAMP,
some_value BIGINT
);
Run Code Online (Sandbox Code Playgroud)
我需要找到t1不到180天的每一行.即使表中存在与搜索谓词匹配的数据,以下查询也不会产生任何行.
select *
from t1
where created > date_sub(from_unixtime(unix_timestamp()), 180);
Run Code Online (Sandbox Code Playgroud)
在Hive中执行日期比较的适当方法是什么?
我无法在hive中定义地图类型.根据Hive手册,肯定有一种地图类型,遗憾的是没有任何关于如何使用它的例子.:-(
假设,我有一个表(用户),其中包含以下列:
Name Ph CategoryName
Run Code Online (Sandbox Code Playgroud)
此"CategoryName"列具有特定的值集.现在我想创建一个将CategoryName映射到CategoryID的哈希表.我试过做:
set hivevar:nameToID=map('A',1,'B',2);
Run Code Online (Sandbox Code Playgroud)
我有两个问题:
当我这样做时,set hivevar:${nameToID['A']}我认为它会将值打印为1.但我得到"$ {hivevar:nameToID ['A']}未定义"
我不知道怎么说, select name, ph, ${nameToID[CategoryName]} from users
我不确定我在这里做错了什么:
hive> CREATE TABLE default.testtbl(int1 INT,string1 STRING)
stored as orc
tblproperties ("orc.compress"="NONE")
LOCATION "/user/hive/test_table";
FAILED: ParseException line 1:107 missing EOF at 'LOCATION' near ')'
Run Code Online (Sandbox Code Playgroud)
而以下查询完全正常:
hive> CREATE TABLE default.testtbl(int1 INT,string1 STRING)
stored as orc
tblproperties ("orc.compress"="NONE");
OK
Time taken: 0.106 seconds
Run Code Online (Sandbox Code Playgroud)
我在这里错过了一些东西.任何指针都会有所帮助.谢谢!
我在两个表之间执行简单连接时收到此错误.我在Hive命令行中运行此查询.我将表命名为a&b.表a是Hive内部表,b是外部表(在Cassandra中).表a只有1610行,表b有~8百万行.在实际生产场景中,表a可以达到100K行.下面显示的是我与表b的连接作为连接中的最后一个表
选择a.col1,a.col2,b.col3,b.col4 FROM JOIN b ON(a.col1 = b.col1 AND a.col2 = b.col2);
下面显示的是错误
总MapReduce作业= 1
执行日志位于:/tmp/pricadmn/.log
2014-04-09 07:15:36开始启动本地任务来处理地图联接; 最大内存= 932184064
2014-04-09 07:16:41处理行数:200000哈希表大小:199999内存使用情况:197529208百分比:0.212
2014-04-09 07:17:12处理行数:300000哈希表大小:299999内存使用情况: 163894528比例:0.176
2014年4月9日七时十七分43秒处理行:400000哈希表大小:399999内存使用:347109936比例:0.372
... ...
... ...
... ...
2014年4月9日7时24分29秒处理行:1600000哈希表大小:1599999内存使用情况:714454400百分比:0.766
2014-04-09 07:25:03处理行:1700000哈希表大小:1699999内存使用情况:901427928百分比:0.967
执行失败,退出状态:3
获取错误信息
任务失败!
任务ID:
Stage- 5日志
:
/u/applic/pricadmn/dse-4.0.1/logs/hive/hive.log
FAILED:执行错误,从org.apache.hadoop.hive.ql.exec.mr返回代码3 .MapredLocalTask
我正在使用DSE 4.0.1.以下是我可能感兴趣的一些设置
mapred.map.child.java.opts = -Xmx512M
mapred.reduce.child.java.opts = -Xmx512M
mapred.reduce.parallel.copies = 20
hive.auto.convert .加入=真
我将mapred.map.child.java.opts增加到了1G,我得到了更多的记录然后出错了.它看起来不是一个好的解决方案.我也改变了连接中的顺序但没有帮助.我看到这个链接Hive Map join:out of memory Exception但是没有解决我的问题.
对我来说,看起来Hive试图在本地任务阶段将更大的表放在内存中,我感到困惑.根据我的理解,第二张表(在我的情况下表b)应该流入.如果我错了,请纠正我.我们非常感谢您解决此问题的任何帮助.
我有两个表有一个单键列.表a中的键是表b中所有键的子集.我需要从表b中选择不在表a中的键.
以下是来自Hive手册的引文:"LEFT SEMI JOIN以高效的方式实现了不相关的IN/EXISTS子查询语义.从Hive 0.13开始,使用子查询支持IN/NOT IN/EXISTS/NOT EXISTS运算符,因此这些JOIN中的大部分都没有不必再手动执行.使用LEFT SEMI JOIN的限制是右侧表只应在连接条件(ON子句)中引用,而不能在WHERE-或SELECT子句中引用. "
他们使用这个例子来说明:
SELECT a.key, a.value FROM a WHERE a.key IN (SELECT b.key FROM B);
Run Code Online (Sandbox Code Playgroud)
相当于
SELECT a.key, a.val FROM a LEFT SEMI JOIN b ON (a.key = b.key);
Run Code Online (Sandbox Code Playgroud)
但是,我需要做的是第一个带'NOT IN;的例子.不幸的是,Hive 0.13不支持这种语法.这仅用于说明:
SELECT a.key, a.value FROM a WHERE a.key NOT IN (SELECT b.key FROM B);
Run Code Online (Sandbox Code Playgroud)
我搜索了这个网站的建议,看到了这个例子:
SELECT a.key FROM a LEFT OUTER JOIN b ON a.key = b.key WHERE b.key IS NULL;
Run Code Online (Sandbox Code Playgroud)
它没有按预期工作.当我加入a.key而不是b和a.key IN b时,我不会这样得到原文.也许那是因为这个查询无法做到这一点,注意粗体文本 - b.key不应该出现在WHERE中.
那我该怎么办?还有其他技巧吗?谢谢!
PS我无法分享任何真实数据; 这是一个非常简单的例子,其中a中的键都包含在b中,a是b的子集.
我试着像这样编写Hive Sql
SELECT count(1), substr(date, 1, 4) as year
FROM ***
GROUP BY year
Run Code Online (Sandbox Code Playgroud)
但是Hive无法识别别名'year',它抱怨:FAILED:SemanticException [错误10004]:行1:79无效的表别名或列引用'year'
一个解决方案(Hive:SELECT AS和GROUP BY)建议使用'GROUP BY substr(date,1,4)'.
有用!但是在某些情况下,我想分组的值可能是从多行hive函数代码生成的,编写代码就像是非常难看
SELECT count(1), func1(func2(..........................)) AS something
FROM ***
GROUP BY func1(func2(..........................))
Run Code Online (Sandbox Code Playgroud)
Hive有没有干净的方法来做到这一点?有什么建议?
HiveQL(以及一般的SQL)中的常见查询构建模式是选择所有列(SELECT *)或显式指定的列(SELECT A, B, C).SQL没有内置机制来选择除指定的列集之外的所有列.
如本SO问题所述,有各种排除某些列的机制,但没有一种适用于HiveQL.(例如,创建一个临时表,SELECT *然后ALTER TABLE DROP使用其某些列的想法会在大数据环境中造成严重破坏.)
忽略关于选择除了一些列以外的所有列是否是一个好主意的意识形态讨论,这个问题是关于用这种能力扩展Hive的可能方法.
在Hive 0.13.0之前,SELECT可以采用基于正则表达式的列,例如,property_.*在反引号引用的字符串中.@ invoketheshell下面的答案指的是这个功能,但它是有代价的,即当启用此功能时,Hive不能接受其中包含非标准字符的列,例如,$foo或x/y.这就是Hive开发人员默认情况下在0.13.0中关闭此行为的原因.我正在寻找适用于任何列名称的通用解决方案.
生成通用表的UDF(UDTF)当然可以这样做,因为它可以操作模式.由于我们不打算生成新行,有没有办法使用简单的基于行的UDF解决这个问题?
这似乎是Web上许多帖子的常见问题,显示如何为各种数据库解决它,但我还没有找到Hive的解决方案.是否有代码可以执行此操作?
我必须更改分区列名称(不是分区规范),我在hive wiki和一些google页面中查找命令.我可以找到改变分区规范的选项,
即例如
在/ table/country ='US'我可以将美国改为美国,但我想将国家改为大陆.
我觉得可用于更改分区列名的唯一选项是删除并重新创建表.有没有其他选择可以帮助我.
提前致谢.
Hiveql中是否有一个等效于TS(右()或左()函数的函数?例如,RIGHT(col1,10)从col1获取前10个字符.
谢谢