SELECT COL HIVE SQL VALUE VALERES< 5000

时间:2017-06-12 02:07:04

标签: sql hive mapreduce apache-pig

我正在学习HIVE,我遇到了一个似乎无法找到可行答案的问题。我必须从表中提取仅包含整数值< 5000的所有数字列,并创建一个空格分隔的文本文件。我熟悉创建文本文件和选择行,但选择符合我不熟悉的特定参数的列,任何帮助或指导将不胜感激!下面我列出了表格的结构。此外,还附有一个图像,以表格形式显示数据。对于OUTPUT,我需要遍历所有COLUMNS并仅返回符合整数值小于5000的参数的COLUMNS。

create table lineorder (
  lo_orderkey          int,
  lo_linenumber        int,
  lo_custkey           int,
  lo_partkey           int,
  lo_suppkey           int,
  lo_orderdate         int,
  lo_orderpriority     varchar(15),
  lo_shippriority      varchar(1),
  lo_quantity          int,
  lo_extendedprice     int,
  lo_ordertotalprice   int,
  lo_discount          int,
  lo_revenue           int,
  lo_supplycost        int,
  lo_tax               int,
  lo_commitdate         int,
  lo_shipmode          varchar(10)
)

Data in tbl format

2 个答案:

答案 0 :(得分:1)

条件列选择是可怕可怕没有好非常糟糕的想法。

就是说,这是一个演示。

with    t as 
        (
            select      stack
                        (
                            3

                           ,10 ,100  ,1000 ,'X' ,null
                           ,20 ,null ,2000 ,'Y' ,200000
                           ,30 ,300  ,3000 ,'Z' ,300000
                        ) as (c1,c2,c3,c4,c5)
        )


select  regexp_replace
        (
            printf(concat('%s',repeat(concat(unhex(1),'%s'),field(unhex(1),t.*,unhex(1))-2)),*)
           ,concat('([^\\x01]*)',repeat('\\x01([^\\x01]*)',field(unhex(1),t.*,unhex(1))-2))
           ,c.included_columns
        )       as record

from    t

       cross join      (select  ltrim
                                (
                                    regexp_replace
                                    (
                                        concat_ws(' ',sort_array(collect_set(printf('$%010d',pos+1))))
                                       ,concat
                                        (
                                            '( ?('
                                           ,concat_ws
                                            (
                                                '|'
                                               ,collect_set
                                                (
                                                    case 
                                                        when    cast(pe.val as int) >= 5000
                                                             or cast(pe.val as int) is null

                                                        then    printf('\\$%010d',pos+1)
                                                    end
                                                )
                                            ) 
                                           ,'))|(?<=\\$)0+'
                                        )
                                       ,''
                                    ) 
                                )       as included_columns

                        from    t
                                lateral view posexplode(split(printf(concat('%s',repeat(concat(unhex(1),'%s'),field(unhex(1),*,unhex(1))-2)),*),'\\x01')) pe
                        ) c
+---------+
| record  |
+---------+
| 10 1000 |
| 20 2000 |
| 30 3000 |
+---------+

答案 1 :(得分:0)

我不认为hive支持函数中的变量替换。因此,您必须编写一个shell脚本来执行第一个返回所需列的查询。然后您可以将它分配给shell脚本中的变量,然后创建一个新查询以在本地目录中创建文件并通过hive -e运行它来自bash。

create table t1(x int , y int) ; // table used for below query

示例bash脚本:

cols =hive -e 'select concat_ws(',', case when min(x) > 5000 then 'x' end , case when min(y) > 5000 then 'y' end) from t1'
query ="INSERT OVERWRITE LOCAL DIRECTORY <directory name> ROW FORMAT DELIMITED FIELDS TERMINATED BY ' ' select  $cols from t1 "
hive -e query