我正在尝试在Airflow上运行测试任务,但始终出现以下错误:
失败:ParseException 2:0无法识别'create_import_table_fct_latest_values''附近的输入。 'hql'
这是我的Airflow Dag文件:
import airflow
from datetime import datetime, timedelta
from airflow.operators.hive_operator import HiveOperator
from airflow.models import DAG
args = {
'owner': 'raul',
'start_date': datetime(2018, 11, 12),
'provide_context': True,
'depends_on_past': False,
'retries': 2,
'retry_delay': timedelta(minutes=5),
'email': ['raul.gregglino@leroymerlin.ru'],
'email_on_failure': True,
'email_on_retry': False
}
dag = DAG('opus_data',
default_args=args,
max_active_runs=6,
schedule_interval="@daily"
)
import_lv_data = HiveOperator(
task_id='fct_latest_values',
hive_cli_conn_id='metastore_default',
hql='create_import_table_fct_latest_values.hql ',
hiveconf_jinja_translate=True,
dag=dag
)
deps = {}
# Explicity define the dependencies in the DAG
for downstream, upstream_list in deps.iteritems():
for upstream in upstream_list:
dag.set_dependency(upstream, downstream)
这是我的HQL文件的内容,以防万一这可能是问题所在,我无法确定:
*I'm testing the connection to understand if the table is created or not, then I'll try to LOAD DATA, hence the LOAD DATA is commented out.
CREATE TABLE IF NOT EXISTS opus_data.fct_latest_values_new_data (
id_product STRING,
id_model STRING,
id_attribute STRING,
attribute_value STRING
) ROW FORMAT DELIMITED FIELDS TERMINATED ',';
#LOAD DATA LOCAL INPATH
#'/media/windows_share/schemas/opus/fct_latest_values_20181106.csv'
#OVERWRITE INTO TABLE opus_data.fct_latest_values_new_data;
答案 0 :(得分:1)
在HQL文件中,它应该为FIELDS TERMINATED BY ','
:
CREATE TABLE IF NOT EXISTS opus_data.fct_latest_values_new_data (
id_product STRING,
id_model STRING,
id_attribute STRING,
attribute_value STRING
) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
注释应在HQL文件中以--
开头,而不是#
这似乎也不正确,并导致异常hql='create_import_table_fct_latest_values.hql '
看看这个例子:
#Create full path for the file
hql_file_path = os.path.join(os.path.dirname(__file__), source['hql'])
print hql_file_path
run_hive_query = HiveOperator(
task_id='run_hive_query',
dag = dag,
hql = """
{{ local_hive_settings }}
""" + "\n " + open(hql_file_path, 'r').read()
)
有关更多详细信息,请参见here。
或将所有HQL放入hql参数:
hql='CREATE TABLE IF NOT EXISTS opus_data.fct_latest_values_new_data ...'
答案 1 :(得分:0)
我设法找到问题的答案。
它与我的HiveOperator调用文件的路径有关。由于尚未定义变量来告诉Airflow在哪里寻找,所以我遇到了我在帖子中提到的错误。
一旦我使用Web服务器界面定义了它(见图),我的dag就开始正常工作。
我仅针对组织的文件位置更改了DAG代码,这就是我的HiveOperator现在的样子:
$ awk -F"\t" '
NR>2 { # starting on the third record
a[$1] # hash first...
a[$2] # and second columns
}
END { # after all that hashing
for(i in a) # iterate whole hash
print i # and output
}' file
感谢(@panov.st)亲自帮助我确定了我的问题。