Google Bigquery
테이블에 액세스하기 위해 셸에서 쿼리를 실행하고 있습니다 . 오류의 원인을 파악할 수 없습니다.
#!/bin/bash
file_path='/home/vikrant_singh_rana/test_bq_file.csv'
{
read
while IFS=, read -r name local_unit region_unit
do
test_tablename=XYZ_KLM_${name}
echo $test_tablename
bq query --format=pretty --use_legacy_sql=false --project_id='test-data-project' "select DATE(COLLECTTIME) DATE,count(distinct COLLECTTIME) as record_count FROM `${project_id}.Test_INGEST.${test_tablename}` where DATE(collecttime) >= '2020-12-01' group by DATE order by DATE asc;"
done
} < $file_path
다음은 읽을 입력 파일입니다.
vikrant_singh_rana@cloudshell:~$ cat test_bq_file.csv
name,local_unit,region_unit
AAAAA,hour,cell
BBBBB,15min,cell
오류는 다음과 같습니다
read_bq_table.sh: line 22: .Test_INGEST.XYZ_KLM_AAAAA: command not found
Error in query string: Error processing job 'test-data-project:bqjob_r54dd3bbd143fcd42_0000017667292a54_1': Syntax error: Unexpected keyword WHERE at [1:81]
답변1
큰따옴표로 묶인 문자열
"select DATE(COLLECTTIME) DATE,count(distinct COLLECTTIME) as record_count FROM `${project_id}.Test_INGEST.${test_tablename}` where DATE(collecttime) >= '2020-12-01' group by DATE order by DATE asc;"
이 부분
`${project_id}.Test_INGEST.${test_tablename}`
쉘에서는 명령 대체로 처리됩니다. 이는 백틱이 따옴표 없이 또는 큰따옴표로 묶인 문자열 내에 나타날 때 명령 대체를 도입하기 때문에 발생합니다. 쉘은 역따옴표 안의 변수를 확장하고 그 결과를 명령으로 실행하려고 시도합니다.
$(${project_id}.Test_INGEST.${test_tablename})
`...`
명령을 실행하여 생성된 출력은 $(...)
적어도 의미 있는 명령을 사용하여 의도적으로 수행된 경우 명령 대체를 대체합니다. 귀하의 경우 백틱은 데이터베이스 구문의 일부이며 쉘이 백틱으로 작업을 수행하지 않고 리터럴 백틱으로 전달되어야 합니다.
백틱을 문자 그대로 사용하려면 인용을 고려하세요.
"select DATE(COLLECTTIME) DATE,count(distinct COLLECTTIME) as record_count FROM \`$project_id.Test_INGEST.$test_tablename\` where DATE(collecttime) >= '2020-12-01' group by DATE order by DATE asc;"
또한 변수 이름 주위에 불필요한 중괄호를 제거했습니다.
이상적으로는 변수 값을 데이터베이스에 삽입하기 전에 삭제하는 것이 좋습니다. 최소한 역따옴표가 포함된 문자열을 감지하고 거부해야 합니다.
또한 표시되는 코드는 변수 값을 설정하는 것으로 나타나지 않습니다(이것이 project_id
오류 메시지에서 이전 문자열 부분이 비어 있는 이유입니다)..Test_INGEST