【问题标题】:How to extract the values in tick separated by comma between the bracket of "PARTITIONED BY" clause如何提取“PARTITIONED BY”子句括号之间用逗号分隔的刻度中的值
【发布时间】:2018-08-07 20:37:47
【问题描述】:

我有一个 shell 脚本,它为数据库中的所有表提取 create table 语句的语法。我一次循环一个 create table 语句,create table 语句将在循环中作为变量 $DATA 使用。我需要在 partitioned by 子句中提取 create table 语句中的列。

例如,$DATA 是循环内的变量

迭代 1 到循环的输入:

DATA="CREATE TABLE `xxx`( `path` varchar(200), `fsize` bigint, `usrname` varchar(100)) PARTITIONED BY ( `depth` int, `permi` varchar(100)) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 'xxx' TBLPROPERTIES ( 'transient_lastDdlTime'='1519784177')"

迭代 1 的输出: 数据输出=深度,permi

迭代 2 到循环的输入:

DATA="CREATE TABLE `xxx`( `path` varchar(200), `fsize` bigint, `usrname` varchar(100)) PARTITIONED BY ( `depth` int) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 'xxx' TBLPROPERTIES ( 'transient_lastDdlTime'='1519784177')"

迭代 2 的输出: 数据输出=深度

迭代 3 到循环的输入:

DATA="CREATE TABLE `xxx`( `path` varchar(200), `fsize` bigint, `usrname` varchar(100)) PARTITIONED BY ( `depth` int, `permi` varchar(100), `www` int) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 'xxx' TBLPROPERTIES ( 'transient_lastDdlTime'='1519784177')"

第 3 次迭代的输出: 数据输出=深度,permi,www

【问题讨论】:

  • , www int)www没有回帖
  • 抱歉,我错过了www 中的反勾号。

标签: shell perl awk sed


【解决方案1】:

试试这个:

my @bcktik = "";
while(<DATA>)
{
    if($_=~m/PARTITIONED BY\s*\(((?:\(.*\)|[^\(])*)\)/i)
    {
        push(@bcktik, join "\,", ($1=~m/`([^`]*)`/g));
    }
}
print "$_\n" for @bcktik;

__DATA__
CREATE TABLE `xxx`( `path` varchar(200), `fsize` bigint, `usrname` varchar(100)) PARTITIONED BY ( `depth` int, `permi` varchar(100)) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 'xxx' TBLPROPERTIES ( 'transient_lastDdlTime'='1519784177')

CREATE TABLE `xxx`( `path` varchar(200), `fsize` bigint, `usrname` varchar(100)) PARTITIONED BY ( `depth` int) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 'xxx' TBLPROPERTIES ( 'transient_lastDdlTime'='1519784177')

CREATE TABLE `xxx`( `path` varchar(200), `fsize` bigint, `usrname` varchar(100)) PARTITIONED BY ( `depth` int, `permi` varchar(100), `www` int) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 'xxx' TBLPROPERTIES ( 'transient_lastDdlTime'='1519784177')

【讨论】:

  • 感谢您花时间回答我的问题。我确实尝试在 shell 脚本中使用 sed 但它不起作用。我认为 perl 在字符串提取方面会更好。我没有使用 perl 的经验。
  • 这是大型 shell 脚本的一部分。下面的步骤将在一个循环内。只有一个 SQL 语句将作为输入发送到下面。您的代码按预期工作,但如何更改您的代码以满足我的问题?我的@bcktik = ""; while() { if($_=~m/PARTITIONED BY\s*\(((?:\(.*\)|[^\(])*)\)/i) { push(@ bcktik, 加入 "\,", ($1=~m/([^]*)`/g)); } } 为@bcktik 打印“$_\n”;
  • 只是一个例子,DATA = "CREATE TABLE xxx( path varchar(200), fsize bigint, usrname varchar(100)) PARTITIONED BY (depth int, permi varchar(100)) 行格式 SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' 存储为输入格式 'org.apache.hadoop.mapred.TextInputFormat' 输出格式 'org.apache.hadoop.hive。 ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 'xxx' TBLPROPERTIES ('transient_lastDdlTime'='1519784177')"
猜你喜欢
  • 2020-01-15
  • 2019-08-23
  • 2013-10-20
  • 1970-01-01
  • 2012-09-22
  • 1970-01-01
  • 2011-11-18
  • 2012-05-15
相关资源
最近更新 更多