DataWorks想在mapreduce中指定两个表的所有分区,用 app_id=''不可以,有什么办法吗?job);InputUtils.addTable(TableInfo.builder().tableName("middleoffice_report_transaction_t_wideorder_dws").partSpec("app_id=''").build(), job);
OutputUtils.addTable(TableInfo.builder().tableName("middleoffice_report_transaction_t_wideorder_day_dws").partSpec("app_id='*'").build(), job);
在DataWorks中,如果你想在MapReduce作业中指定两个表的所有分区,你可以使用 InputUtils
和 OutputUtils
类的 addTable()
方法。
但是,你需要确保你在调用这个方法时正确地指定了分区信息。根据你的代码片段,我注意到你在为输入表 "middleoffice_report_transaction_t_wideorder_dws" 指定分区时使用了 partSpec("app_id='')
。这可能意味着你想要选择所有分区,但在这种情况下,你实际上选择了包含空字符串作为其 "app_id" 分区值的所有分区。
如果你想要选择所有分区,你应该将 partSpec()
的参数更改为 partSpec("*")
或者直接省略这个参数。例如:
InputUtils.addTable(TableInfo.builder().tableName("middleoffice_report_transaction_t_wideorder_dws").partSpec("*").build(), job);
OutputUtils.addTable(TableInfo.builder().tableName("middleoffice_report_transaction_t_wideorder_day_dws").partSpec("*").build(), job);
在 DataWorks 中,您可以使用 InputUtils.addTable
和 OutputUtils.addTable
方法来指定 MapReduce 作业的输入表和输出表。这两个方法都需要一个 TableInfo
参数,其中包含表名和分区信息。
然而,由于 Spark SQL 不支持 app_id=''
这种方式来指定所有分区,所以您不能直接在 DataWorks 中使用这种方式。取而代之,您可以使用以下两种方法之一来解决这个问题:
HiveContext
创建一个临时视图,然后再使用这个视图作为 MapReduce 作业的输入表。例如,您可以先执行以下命令:val df = spark.sql("SELECT * FROM middleoffice_report_transaction_t_wideorder_dws WHERE app_id=''")
df.createOrReplaceTempView("temp_view")
然后,您可以将这个临时视图作为输入表传递给 MapReduce 作业:
val inputDF = spark.sql("SELECT * FROM temp_view")
hive -e "CREATE TABLE middleoffice_report_transaction_t_wideorder_day_dws AS SELECT * FROM middleoffice_report_transaction_t_wideorder_dws WHERE app_id=''"
然后,您可以将新创建的表作为输入表传递给 MapReduce 作业:
val inputDF = spark.sql("SELECT * FROM middleoffice_report_transaction_t_wideorder_day_dws")
在DataWorks的MapReduce任务中,可以通过设置partSpec
参数来指定表的所有分区。但是,您提供的代码示例中存在一些问题。首先,partSpec
参数应该放在TableInfo.builder()
方法内部,而不是直接放在tableName
方法内部。其次,app_id=''
和app_id='*'
这样的格式是不正确的,应该使用逗号分隔多个分区。
以下是一个修正后的示例:
InputUtils.addTable(TableInfo.builder().tableName("middleoffice_report_transaction_t_wideorder_dws").partSpec("app_id='',...其他分区").build(), job);
OutputUtils.addTable(TableInfo.builder().tableName("middleoffice_report_transaction_t_wideorder_day_dws").partSpec("app_id='',...其他分区").build(), job);
请将...其他分区
替换为实际的分区信息。这样,您的MapReduce任务就可以指定两个表的所有分区了。
使用 app_id='' 不可以指定所有的分区,您可以尝试使用通配符 "" 来代替空字符串,如 "app_id=''"。
例如:
InputUtils.addTable(TableInfo.builder().tableName("middleoffice_report_transaction_t_wideorder_dws").partSpec("app_id='*'").build(), job);
OutputUtils.addTable(TableInfo.builder().tableName("middleoffice_report_transaction_t_wideorder_day_dws").partSpec("app_id='*'").build(), job);
这将会匹配所有 app_id 的分区。不同的系统可能会有不同的语法来表示匹配所有分区,因此请根据您的实际环境进行调整。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
DataWorks基于MaxCompute/Hologres/EMR/CDP等大数据引擎,为数据仓库/数据湖/湖仓一体等解决方案提供统一的全链路大数据开发治理平台。