因此,我有一个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脚本)。
1条答案
按热度按时间eni9jsuy1#
我们在chat中讨论了以下两种解决方案:
如果你的格式是一致的
transient
总是出现在结束语所在的行中';'
最后需要一个简单的sed
所需要的只是替换,例如。(添加
-i
用于在位编辑文件和/或添加-i.bak
在位编辑以保持原始文件与.bak
扩展)如果另一方面,内容可以改变
transient
可能存在也可能不存在,然后您可以关闭TBLPROPERTIES
标记,然后向前扫描文件以找到第一个结束符')'
跟随TBLPROPERTIES
加上结束语';'
在那里。awk
提供了一个更健壮的解决方案,因为没有保证在这两个系统之间可能有多少行TBLPROPERTIES
最后呢')'
. 在......下面awk
与简单变量一起使用look
作为一个标志,指示您是否正在寻找结束')'
过了一段时间TBLPROPERTIES
(look=1
),还是不(look=0
).例如:
gnu公司
awk
有gawk -i inplace
允许在位编辑文件的扩展名,类似于sed
,否则只需将输出重定向到临时文件,然后复制或移动到原始文件名。是否使用
sed
或者awk
在上面,输出具有所需的端接';'
,例如。如果你还有其他问题,请告诉我。