Найти строку и извлечь значения из результата запроса улья, используя скрипт оболочки? - PullRequest
0 голосов
/ 22 апреля 2020

Вопрос Аналогично: Найти и извлечь значение после указания c Строка из файла с использованием bash сценария оболочки?

Я выполняю запрос улья из сценария оболочки и мне нужно для извлечения некоторого значения из переменной запрос выглядит следующим образом:

sql="show create table dev.emp"
partition_col= `beeline -u $Beeline_URL -e $sql` | grep 'PARTITIONED BY' | cut -d "'" -f2`

вывод запроса sql ниже:

+----------------------------------------------------+
|                   createtab_stmt                   |
+----------------------------------------------------+
| CREATE EXTERNAL TABLE `dv.par_kst`(                |
|   `col1` string,                                   |
|   `col2` string,                                  |
|   `col3` string)                                  |
| PARTITIONED BY (                                   |
|   `part_col1` int,                                 |
|   `part_col2` int)                                 |
| ROW FORMAT SERDE                                   |
|   'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'  |
| STORED AS INPUTFORMAT                              |
|   'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'  |
| OUTPUTFORMAT                                       |
|   'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat' |
| LOCATION                                           |
|   'hdfs://nameservicets1/dv/hdfsdata/par_kst' |
| TBLPROPERTIES (                                    |
|   'spark.sql.create.version'='2.2 or prior',       |
|   'spark.sql.sources.schema.numPartCols'='2',      |
|   'spark.sql.sources.schema.numParts'='1',         |
|   'spark.sql.sources.schema.part.0'='{"type":"struct","fields":[{"name":"col1","type":"string","nullable":true,"metadata":{}},{"name":"col2","type":"string","nullable":true,"metadata":{}},{"name":"col3","type":"integer","nullable":true,"metadata":{}},{"name":"part_col2","type":"integer","nullable":true,"metadata":{}}]}',  |
|   'spark.sql.sources.schema.partCol.0'='part_col1', |
|   'spark.sql.sources.schema.partCol.1'='part_col2', |
|   'transient_lastDdlTime'='1587487456')            |
+----------------------------------------------------+

сверху sql, я хочу извлечь PARTITIONED BY details.

Desired output :

part_col1 , part_col2

пробовал с приведенным ниже кодом, но не получил правильное значение:

partition_col=`beeline -u $Beeline_URL -e $sql` | grep 'PARTITIONED BY' | cut -d "'" -f2`

, и эти PARTITIONED BY не исправлены, значит для какого-то другого файла он может содержать 3 или больше, поэтому я хочу извлечь все PARTITIONED BY.

Все значения между PARTITIONED BY и ROW FORMAT SERDE, удаляя пробелы "` "и типы данных!

Не могли бы вы помочь мне с этим

Ответы [ 2 ]

2 голосов
/ 22 апреля 2020

Использование sed

sed -n  '/PARTITIONED BY/,/ROW FORMAT SERD/p' file.txt | sed  '1d; $d' |  sed  -E 's/.*(`.*`).*/\1/g' |  tr -d '`' | tr '\n' ','

Демонстрация:

$sed -n  '/PARTITIONED BY/,/ROW FORMAT SERD/p' file.txt | sed  '1d; $d' |  sed  -E 's/.*(`.*`).*/\1/g' |  tr -d '`'  | tr '\n' ','
part_col1,part_col2,$
$

объяснение:

sed -n '/PARTITIONED BY/,/ROW FORMAT SERD/p' <--- печать строки между двумя рисунками </p>

sed '1d; $d' <- удалить первую и последнюю строку </p>

sed -E 's/.*(. *).*/\1/g' <- вывести строку между `` `</p>

tr -d ' '` <- удалить `` `char </p>

tr '\n' ',' <- заменить новую строку на <code>,

0 голосов
/ 22 апреля 2020

Вы можете использовать awk:

/PARTITIONED BY \(/  {partitioned_by = 1; next}
/ROW FORMAT SERDE/  {partitioned_by = 0; next}
partitioned_by == 1 {a[n++] = substr($2, 2, length($2) - 2)}
END { for (i in a) printf "%s, ", i}

, сохранить вышеперечисленное в файле с именем beeline.awk и выполнить с:

partition_col=`beeline -u $Beeline_URL -e $sql` | awk -f beeline.awk
...