如何添加;在每个“show create table”的末尾

cld4siwp  于 2021-06-24  发布在  Hive
关注(0)|答案(1)|浏览(465)

因此,我有一个txt文件,其中包含以下内容:

CREATE EXTERNAL TABLE `table1`(
  `tab_id bigint COMMENT 'The unique identifier of thetable')
ROW FORMAT SERDE 
  *
STORED AS INPUTFORMAT 

* 

OUTPUTFORMAT 
  *
LOCATION
  *
TBLPROPERTIES (
  'transient_lastDdlTime'='1556u3ehw27')
CREATE TABLE `table2`(
  `count` bigint)
ROW FORMAT SERDE 
 * 
STORED AS INPUTFORMAT 
  *
OUTPUTFORMAT 
  *
LOCATION
  'hdfs://path/'
TBLPROPERTIES (
  'transient'='15407')

正如您所看到的,在每个表的ddl之后,没有;在它的结尾,我试图写一个程序,插入一个;在每个表的ddl之后。所以输出应该是这样的:

CREATE EXTERNAL TABLE `table1`(
  `tab_id bigint COMMENT 'The unique identifier of thetable')
ROW FORMAT SERDE 
  *
STORED AS INPUTFORMAT 

* 

OUTPUTFORMAT 
  *
LOCATION
  *
TBLPROPERTIES (
  'transient_lastDdlTime'='1556u3ehw27');
CREATE TABLE `table2`(
      `count` bigint)
    ROW FORMAT SERDE 
     * 
    STORED AS INPUTFORMAT 
      *
    OUTPUTFORMAT 
      *
    LOCATION
      'hdfs://path/'
    TBLPROPERTIES (
      'transient'='15407');

我试过两种方法(1) 通过将其添加到ddl创建脚本和python程序中。
下面是我的ddl creation.sh脚本,它在数据库的表中运行,并为数据库中的所有表生成一个文件。我尝试使用下面最后一行(#cat…)中显示的cat函数来执行此操作,但一直收到错误。

hiveDBName=my_db;

showcreate="show create table "

 showpartitions="show partitions "

 terminate=";"

 tables=`hive -e "use $hiveDBName;show tables;"`

 tab_list=`echo "${tables}"`

 rm -f ${hiveDBName}_all_table_partition_DDL.sql

 for list in $tab_list
 do
        echo "Generating table script for " ${hiveDBName}.${list}
        showcreatetable=${showcreatetable}${showcreate}${hiveDBName}.${list}${terminate}

 done

 echo " ====== Create Tables ======= : " $showcreatetable

## Remove the file

      rm -f ${hiveDBName}_extract_all_tables.txt

      hive -e "use $hiveDBName; ${showcreatetable}" > /home/path/filter_ddls/aa.sql
      grep -v "WARN" /home/path/filter_ddls/aa.sql >/home/path/hive_db_ddls/${hiveDBName}_extract_all_tables.sql
     # cat a1.sql + ";\n\n" >> ${hiveDBName}_extract_all_tables.sql

下面是我的python程序,但是这个方法的输出增加了;仅在跳过某些表的tblproperty之后。

import re
f = open("/home/path/ddl.sql", 'rt', encoding='latin-1').read()

with open("/home/path/new_ddl.sql","w") as output:
    output.write(re.sub(r'(TBLPROPERTIES \(.*?\))', r'\1;', f, flags=re.DOTALL))

有什么想法或建议来实现这一点吗?首选第一个选项(.sh脚本)。

eni9jsuy

eni9jsuy1#

我们在chat中讨论了以下两种解决方案:
如果你的格式是一致的 transient 总是出现在结束语所在的行中 ';' 最后需要一个简单的 sed 所需要的只是替换,例如。

sed '/transient/s/$/;/' file

(添加 -i 用于在位编辑文件和/或添加 -i.bak 在位编辑以保持原始文件与 .bak 扩展)
如果另一方面,内容可以改变 transient 可能存在也可能不存在,然后您可以关闭 TBLPROPERTIES 标记,然后向前扫描文件以找到第一个结束符 ')' 跟随 TBLPROPERTIES 加上结束语 ';' 在那里。 awk 提供了一个更健壮的解决方案,因为没有保证在这两个系统之间可能有多少行 TBLPROPERTIES 最后呢 ')' . 在......下面 awk 与简单变量一起使用 look 作为一个标志,指示您是否正在寻找结束 ')' 过了一段时间 TBLPROPERTIES ( look=1 ),还是不( look=0 ).
例如:

awk -v look=0 '
    /^TBLPROPERTIES/ { look=1 }
    look == 1 {
        if ( sub (/[)]$/,");") )
            look=0
    }1
' file

gnu公司 awkgawk -i inplace 允许在位编辑文件的扩展名,类似于 sed ,否则只需将输出重定向到临时文件,然后复制或移动到原始文件名。
是否使用 sed 或者 awk 在上面,输出具有所需的端接 ';' ,例如。

CREATE EXTERNAL TABLE `table1`(
  `tab_id bigint COMMENT 'The unique identifier of thetable')
ROW FORMAT SERDE
  *
STORED AS INPUTFORMAT

* 

OUTPUTFORMAT
  *
LOCATION
  *
TBLPROPERTIES (
  'transient_lastDdlTime'='1556u3ehw27');
CREATE TABLE `table2`(
  `count` bigint)
ROW FORMAT SERDE
 *
STORED AS INPUTFORMAT
  *
OUTPUTFORMAT
  *
LOCATION
  'hdfs://path/'
TBLPROPERTIES (
  'transient'='15407');

如果你还有其他问题,请告诉我。

相关问题