2014-12-31 1 views
1

HiveQL에 해당하는 MySQL 쿼리를 가져 오려고합니다.하이브 쿼리가 작동하지 않습니다.

는 MySQL의에서이 같은 테이블을 가지고 :

CREATE TABLE votes (
user_id INT, 
list_id INT, 
node_id INT, 
direction STRING 
) ROW FORMAT DELIMITED 
FIELDS TERMINATED BY ',' 
STORED AS TEXTFILE; 

내가 하이브 테이블에 MySQL의 테이블에서 6 개 행을 복사 :

CREATE TABLE votes(
user_id INT UNSIGNED NOT NULL, 
list_id INT UNSIGNED NOT NULL, 
node_id INT UNSIGNED NOT NULL, 
direction ENUM('UP', 'DOWN') NOT NULL, 
PRIMARY KEY (user_id, list_id, node_id) 
) ENGINE=innodb; 

내가 사용 하이브에서 유사한 테이블을 만들었습니다. 그래서 하이브에서, 나는 가지고 :

hive> SELECT * FROM votes; 
OK 
28  390  400058 "UP" 
28  390  400059 "DOWN" 
90113 390  400058 "DOWN" 
90113 390  400059 "UP" 
323694 390  400058 "UP" 
323694 390  400059 "UP" 
Time taken: 0.059 seconds, Fetched: 6 row(s) 

다음 문은 MySQL의에서 잘 작동 : 같은 문에 정확한 수를 제공하지 않습니다 그러나

390 400058 390 400058 2 0 0 1 
390 400058 390 400059 1 1 1 0 
390 400059 390 400058 1 1 1 0 
390 400059 390 400059 2 0 0 1 

을 : 출력

SELECT v1.list_id, v1.node_id, v2.list_id, v2.node_id, 
SUM(IF(v1.direction="UP" AND v2.direction="UP", 1, 0)) AS uu, 
SUM(IF(v1.direction="UP" AND v2.direction="DOWN", 1, 0)) AS ud, 
SUM(IF(v1.direction="DOWN" AND v2.direction="UP", 1, 0)) AS du, 
SUM(IF(v1.direction="DOWN" AND v2.direction="DOWN", 1, 0)) AS dd 
FROM votes v1 
JOIN votes v2 ON v1.user_id=v2.user_id 
GROUP BY v1.list_id, v1.node_id, v2.list_id, v2.node_id; 

하이브 :

hive> SELECT v1.list_id AS lid, v1.node_id AS nid, v2.list_id AS rlid, v2.node_id AS rnid, 
    > SUM(IF(v1.direction="UP" AND v2.direction="UP", 1, 0)) AS uu, 
    > SUM(IF(v1.direction="UP" AND v2.direction="DOWN", 1, 0)) AS ud, 
    > SUM(IF(v1.direction="DOWN" AND v2.direction="UP", 1, 0)) AS du, 
    > SUM(IF(v1.direction="DOWN" AND v2.direction="DOWN", 1, 0)) AS dd 
    > FROM votes v1 
    > JOIN votes v2 ON v1.user_id=v2.user_id 
    > GROUP BY v1.list_id, v1.node_id, v2.list_id, v2.node_id; 

... 

Status: Finished successfully 
OK 
390  400058 390  400058 0  0  0  0 
390  400058 390  400059 0  0  0  0 
390  400059 390  400058 0  0  0  0 
390  400059 390  400059 0  0  0  0 
Time taken: 19.127 seconds, Fetched: 4 row(s) 

어떻게 해결할 수 있습니까?

또한 나는 누군가가 Hive에서 자체 참여를 피하는 것이 최선이라고 언급 한 게시물을 발견했습니다. 이것이 사실이라면 내가 얻으려는 것을 성취하기 위해 왜 그리고 더 나은 질의를 설명 할 수 있습니까?

+0

실행

CREATE TABLE votes (user_id INT, list_id INT, node_id INT, direction STRING) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' WITH SERDEPROPERTIES ("separatorChar" = "\t") -- default seperator is , STORED AS CSVFILE; 

나는 하이브 SERDES와이에 대답을 추가했습니다. Pls는 그것에 의견을 추가합니다. –

답변

0

인용 부호가 실제로 UP/DOWN 값 문자열의 일부인 것처럼 보이므로 비교 문에이를 포함시켜야합니다. 내가 얻을 수있었습니다이 하이브 쿼리를 사용하여 예상 결과 : UP/DOWN 값이 지금은 큰 따옴표는 값의 일부로 해석되어 있는지 확인하기 위해 작은 따옴표로 둘러싸여 있다는

SELECT v1.list_id, v1.node_id, v2.list_id, v2.node_id, 
    SUM(IF(v1.direction='"UP"' AND v2.direction='"UP"', 1, 0)) AS uu, 
    SUM(IF(v1.direction='"UP"' AND v2.direction='"DOWN"', 1, 0)) AS ud, 
    SUM(IF(v1.direction='"DOWN"' AND v2.direction='"UP"', 1, 0)) AS du, 
    SUM(IF(v1.direction='"DOWN"' AND v2.direction='"DOWN"', 1, 0)) AS dd 
FROM votes v1 
JOIN votes v2 ON v1.user_id=v2.user_id 
GROUP BY v1.list_id, v1.node_id, v2.list_id, v2.node_id; 

참고.

+0

맞습니다! CSV 덤프에서 따옴표를 사용 했으므로 따옴표도 값의 일부가되었습니다. 고마워 – arun

1

테이블을 만들 때 use Hive CSVSerde을 권하고 싶습니다. 따라서 큰 따옴표는 DEFAULT_QUOTE_CHARACTER이 CSVSerde 인 경우 " 일 때 SELECT 쿼리에서 자동으로으로 처리됩니다. 선택 (SELECT) 쿼리

SELECT v1.list_id AS lid, v1.node_id AS nid, 
    v2.list_id AS rlid, v2.node_id AS rnid, 
    SUM(IF(v1.direction="UP" AND v2.direction="UP", 1, 0)) AS uu, 
    SUM(IF(v1.direction="UP" AND v2.direction="DOWN", 1, 0)) AS ud, 
    SUM(IF(v1.direction="DOWN" AND v2.direction="UP", 1, 0)) AS du, 
    SUM(IF(v1.direction="DOWN" AND v2.direction="DOWN", 1, 0)) AS dd 
    FROM votes v1 
    JOIN votes v2 ON v1.user_id=v2.user_id 
    GROUP BY v1.list_id, v1.node_id, v2.list_id, v2.node_id; 


+------+---------+-------+---------+-----+-----+-----+-----+--+ 
| lid | nid | rlid | rnid | uu | ud | du | dd | 
+------+---------+-------+---------+-----+-----+-----+-----+--+ 
| 390 | 400058 | 390 | 400058 | 2 | 0 | 0 | 1 | 
| 390 | 400058 | 390 | 400059 | 1 | 1 | 1 | 0 | 
| 390 | 400059 | 390 | 400058 | 1 | 1 | 1 | 0 | 
| 390 | 400059 | 390 | 400059 | 2 | 0 | 0 | 1 | 
+------+---------+-------+---------+-----+-----+-----+-----+--+