Java 配置单元:对数组应用小写

Java 配置单元:对数组应用小写,java,arrays,string,hive,lowercase,Java,Arrays,String,Hive,Lowercase,在配置单元中,如何将较低的UDF应用于字符串数组? 或任何UDF。我不知道如何在select查询中应用映射。如果您的用例是孤立地转换数组,而不是作为表的一部分,那么explode、lower和collect_list的组合应该可以做到这一点。例如,请原谅可怕的执行时间,我在动力不足的虚拟机上运行: hive> SELECT collect_list(lower(val)) > FROM (SELECT explode(array('AN', 'EXAMPLE', 'ARRAY

在配置单元中,如何将较低的UDF应用于字符串数组?
或任何UDF。我不知道如何在select查询中应用映射。如果您的用例是孤立地转换数组,而不是作为表的一部分,那么explode、lower和collect_list的组合应该可以做到这一点。例如,请原谅可怕的执行时间,我在动力不足的虚拟机上运行:

hive> SELECT collect_list(lower(val))
    > FROM (SELECT explode(array('AN', 'EXAMPLE', 'ARRAY')) AS val) t;
...
... Lots of MapReduce spam
...
MapReduce Total cumulative CPU time: 4 seconds 10 msec
Ended Job = job_1422453239049_0017
MapReduce Jobs Launched: 
Job 0: Map: 1  Reduce: 1   Cumulative CPU: 4.01 sec   HDFS Read: 283 HDFS Write: 17 SUCCESS
Total MapReduce CPU Time Spent: 4 seconds 10 msec
OK
["an","example","array"]
Time taken: 33.05 seconds, Fetched: 1 row(s)
注意:将上述查询中的数组“AN”、“EXAMPLE”、“array”替换为用于生成数组的表达式

相反,如果您的用例是将数组存储在配置单元表的列中,并且需要对其应用小写转换,那么据我所知,您有两个基本选项:

方法1:使用“爆炸”和“侧视图”的组合来分离阵列。使用lower转换各个元素,然后收集_列表将它们粘合在一起。一个简单的例子,包含愚蠢的虚构数据:

hive> DESCRIBE foo;
OK
id                          int                                 
data                        array<string>                       
Time taken: 0.774 seconds, Fetched: 2 row(s)
hive> SELECT * FROM foo;
OK
1001        ["ONE","TWO","THREE"]
1002        ["FOUR","FIVE","SIX","SEVEN"]
Time taken: 0.434 seconds, Fetched: 2 row(s)

hive> SELECT
    >   id, collect_list(lower(exploded))
    > FROM
    >   foo LATERAL VIEW explode(data) exploded_table AS exploded
    > GROUP BY id;
...
... Lots of MapReduce spam
...
MapReduce Total cumulative CPU time: 3 seconds 310 msec
Ended Job = job_1422453239049_0014
MapReduce Jobs Launched:
Job 0: Map: 1  Reduce: 1   Cumulative CPU: 3.31 sec   HDFS Read: 358 HDFS Write: 44 SUCCESS
Total MapReduce CPU Time Spent: 3 seconds 310 msec
OK
1001        ["one","two","three"]
1002        ["four","five","six","seven"]
Time taken: 34.268 seconds, Fetched: 2 row(s)

这两种方法之间有一些权衡。一般来说,2在运行时可能比1更有效,因为1中的GROUPBY子句强制执行一个缩减阶段,而UDF方法则没有。但是,1在HiveQL中执行所有操作,并且更易于通用化。如果需要,可以在查询中用其他类型的字符串转换替换lower。使用2的UDF方法,您可能需要为要应用的每种不同类型的转换编写一个新的UDF。

如果您的用例是单独转换一个数组,而不是作为表的一部分,那么explode、lower和collect\u list的组合应该可以实现。例如,请原谅可怕的执行时间,我在动力不足的虚拟机上运行:

hive> SELECT collect_list(lower(val))
    > FROM (SELECT explode(array('AN', 'EXAMPLE', 'ARRAY')) AS val) t;
...
... Lots of MapReduce spam
...
MapReduce Total cumulative CPU time: 4 seconds 10 msec
Ended Job = job_1422453239049_0017
MapReduce Jobs Launched: 
Job 0: Map: 1  Reduce: 1   Cumulative CPU: 4.01 sec   HDFS Read: 283 HDFS Write: 17 SUCCESS
Total MapReduce CPU Time Spent: 4 seconds 10 msec
OK
["an","example","array"]
Time taken: 33.05 seconds, Fetched: 1 row(s)
注意:将上述查询中的数组“AN”、“EXAMPLE”、“array”替换为用于生成数组的表达式

相反,如果您的用例是将数组存储在配置单元表的列中,并且需要对其应用小写转换,那么据我所知,您有两个基本选项:

方法1:使用“爆炸”和“侧视图”的组合来分离阵列。使用lower转换各个元素,然后收集_列表将它们粘合在一起。一个简单的例子,包含愚蠢的虚构数据:

hive> DESCRIBE foo;
OK
id                          int                                 
data                        array<string>                       
Time taken: 0.774 seconds, Fetched: 2 row(s)
hive> SELECT * FROM foo;
OK
1001        ["ONE","TWO","THREE"]
1002        ["FOUR","FIVE","SIX","SEVEN"]
Time taken: 0.434 seconds, Fetched: 2 row(s)

hive> SELECT
    >   id, collect_list(lower(exploded))
    > FROM
    >   foo LATERAL VIEW explode(data) exploded_table AS exploded
    > GROUP BY id;
...
... Lots of MapReduce spam
...
MapReduce Total cumulative CPU time: 3 seconds 310 msec
Ended Job = job_1422453239049_0014
MapReduce Jobs Launched:
Job 0: Map: 1  Reduce: 1   Cumulative CPU: 3.31 sec   HDFS Read: 358 HDFS Write: 44 SUCCESS
Total MapReduce CPU Time Spent: 3 seconds 310 msec
OK
1001        ["one","two","three"]
1002        ["four","five","six","seven"]
Time taken: 34.268 seconds, Fetched: 2 row(s)

这两种方法之间有一些权衡。一般来说,2在运行时可能比1更有效,因为1中的GROUPBY子句强制执行一个缩减阶段,而UDF方法则没有。但是,1在HiveQL中执行所有操作,并且更易于通用化。如果需要,可以在查询中用其他类型的字符串转换替换lower。使用2的UDF方法,您可能需要为要应用的每种不同类型的转换编写一个新的UDF。

您是在尝试操作collect_list/collect_set的结果,还是您的用例更像是需要转换的表中有数组?因为xpath,从xml获取数组。。。我需要确保所有的答案都是小写字母-我在回答的前面添加了另一个可能与您的情况相关的场景。您是否试图操纵收集列表/收集集的结果,或者您的用例更像是您需要转换的表中的数组?因为xpath,从xml获取数组。。。我需要确保它的澄清都是小写的-我在我的答案前面添加了另一个场景,这可能与你的情况有关。我喜欢它!非常感谢所有这些细节。我将首先尝试使用UDF方法,因为我将在此过程中学习一些东西:第一种方法是否可以用于在收集时保持值的相对顺序?我喜欢它!非常感谢所有这些细节。我将首先尝试使用UDF方法,因为我将在此过程中学习一些东西:第一种方法是否可以用于在收集时保持值的相对顺序?