JavaScript UDF在Airflow报错但BigQuery正常的问题求助
问题解决方法
问题根源
你在Airflow的Python代码中用三重引号包裹SQL语句时,SQL内部的r"""会被Python解析器误判为外层字符串的结束标记,从而触发'Unclosed triple-quoted raw string literal'语法错误。
解决方法1:转义SQL内部的三重引号
将SQL中JS代码块的三重引号转义,让Python将其识别为字符串内容而非结束标记:
CREATE TEMP FUNCTION replace_all(input_string STRING, replace_list ARRAY<STRING>) RETURNS STRING LANGUAGE js AS r\"\"\" myarray=input_string.split(" ") for (var i = 0; i < replace_list.length; i++) { for(var j=0;j < myarray.length;j++){ if(myarray[j]==replace_list[i]){ myarray[j] ='' } } } input_string = myarray.join(' ') return input_string; \"\"\";
在Airflow的Python代码中,这段SQL需要放在三重引号的字符串内,转义后的\"\"\"不会被Python误解析。
解决方法2:调整引号嵌套方式
去掉JS代码块的raw字符串标记r,改用单引号包裹JS代码,避免三重引号冲突:
CREATE TEMP FUNCTION replace_all(input_string STRING, replace_list ARRAY<STRING>) RETURNS STRING LANGUAGE js AS ''' myarray=input_string.split(" ") for (var i = 0; i < replace_list.length; i++) { for(var j=0;j < myarray.length;j++){ if(myarray[j]==replace_list[i]){ myarray[j] ='' } } } input_string = myarray.join(' ') return input_string; '''
此写法既不会触发Python解析错误,BigQuery也能正常识别JS代码逻辑。
解决方法3:将SQL存入独立文件
把完整的SQL语句保存为单独的.sql文件(比如replace_function.sql),在Airflow中通过BigQueryOperator直接引用文件路径,彻底规避Python字符串的引号冲突:
from airflow.providers.google.cloud.operators.bigquery import BigQueryOperator replace_task = BigQueryOperator( task_id="run_replace_function", sql="replace_function.sql", use_legacy_sql=False, gcp_conn_id="your_gcp_conn_id" )
内容的提问来源于stack exchange,提问作者vaishna vijayan
相关产品推荐
相关产品推荐

