作业开发问题

本文为您介绍作业开发有关的常见问题。

使用Entrypoint Main Args配置参数时,传入参数包含空格,作业无法运行起来,应该如何处理?

  • 问题详细详情

  • 问题原因

    在VVR为4.x版本时,如果Entrypoint Main Args的参数中间有空格,且整体参数外部没有加双引号,那么中间的空格就会被解析成分号,且作业可能无法运行起来。

  • 解决方案

    将Entrypoint Main Args参数写为"--name \"where a = b\"",即在外部添加一个双引号。修改后能够正常解析内部空格,并且作业能够正常运行。示例

使用Entry point Main Arguments传参数时,需要传特殊字符,应该如何处理?

  • 问题原因

    使用Entry Point Main Arguments传参的时候需要传特殊字符时,例如#$,使用反斜线(\)转义也无法识别,特殊字符出现会被丢弃掉。

  • 解决方案

    其他配置中添加参数env.java.opts: -Dconfig.disable-inline-comment=true,具体操作请参见如何配置作业运行参数?

为什么相同JAR包在经过多次修改后上传失败?

  • 问题原因

    因为UDF里面限制了JAR包之间的类名不能重复。

  • 解决方案

    在附加依赖文件里面上传JAR包,并在代码里面使用临时函数的方式,示例如下。

    CREATE TEMPORARY FUNCTION `cp_record_reduce` AS 'com.taobao.test.udf.blink.CPRecordReduceUDF';

    示例

报错:Could not parse type at position 50: expected but was . Input type string: ROW

  • 报错详情

    用户在SQL编辑器中编写SQL时,使用UDTF出现语法检查错误(红色波浪线)。

    Caused by: org.apache.flink.table.api.ValidationException: Could not parse type at position 50: <IDENTIFIER> expected but was <KEYWORD>. Input type string: ROW<resultId String,pointRange String,from String,to String,type String,pointScope String,userId String,point String,triggerSource String,time String,uuid String>

    代码如下:

    @FunctionHint(
        //input = @DataTypeHint("BYTES"),
        output = @DataTypeHint("ROW<resultId String,pointRange String,from String,to String,type String,pointScope String,userId String,point String,triggerSource String,time String,uuid String>"))
    public class PointChangeMetaQPaser1 extends TableFunction<Row> {
    
        Logger logger = LoggerFactory.getLogger(this.getClass().getName());
    
        public void eval(byte[] bytes) {
            try {
                String messageBody = new String(bytes, "UTF-8");
                Map<String, String> resultDO = JSON.parseObject(messageBody, Map.class);
                logger.info("PointChangeMetaQPaser1 logger:" + JSON.toJSONString(resultDO));
    
                collect(Row.of(
                        getString(resultDO.get("resultId")),
                        getString(resultDO.get("pointRange")),
                        getString(resultDO.get("from")),
                        getString(resultDO.get("to")),
                        getString(resultDO.get("type")),
                        getString(resultDO.get("pointScope")),
                        getString(resultDO.get("userId")),
                        getString(resultDO.get("point")),
                        getString(resultDO.getOrDefault("triggerSource", "NULL")),
                        getString(resultDO.getOrDefault("time", String.valueOf(System.currentTimeMillis()))),
                        getString(resultDO.getOrDefault("uuid", String.valueOf(UUID.randomUUID())))
                ));
            } catch (Exception e) {
                logger.error("PointChangeMetaQPaser1 error", e);
            }
        }
    
        private String getString(Object o) {
            if (o == null) {
                return null;
            }
            return String.valueOf(o);
        }
    }
  • 报错原因

    当使用DataTypeHint定义函数的数据类型时,将系统保留的关键字直接作为了字段名称。

  • 解决方案

    • 将变量名换成非关键字的名称,例如to换成fto,from换成ffrom等。

    • 将已经用关键字取名的变量名加上反撇号(``)。