回复的好详细!而且引出了相关的测试用例
Thanks very much!

















在 2020-05-28 14:23:33,"Leonard Xu" <xbjt...@gmail.com> 写道:
> 
>>        |INSERT INTO dwdCatalog.dwd.t1_copy partition (`p_year` = p_year, 
>> `p_month` = p_month)
>>        |select id,name from dwdCatalog.dwd.t1 where `p_year` = 2020 and 
>> `p_month` = 4 
>
>动态分区不是这样指定的,和hive的语法是一样的,下面两种应该都可以,flink这边文档少了点,可以参考[1][2]
>
>INSERT INTO dwdCatalog.dwd.t1_copy 
>     select id,name,`p_year`,`p_month` from dwdCatalog.dwd.t1 where `p_year` = 
> 2020 and `p_month` = 4 
>
>INSERT INTO dwdCatalog.dwd.t1_copy 
>    select * from dwdCatalog.dwd.t1 where `p_year` = 2020 and `p_month` = 4 
>
>Best,
>Leonard Xu
>[1] 
>https://ci.apache.org/projects/flink/flink-docs-master/dev/table/sql/insert.html#examples
> 
><https://ci.apache.org/projects/flink/flink-docs-master/dev/table/sql/insert.html#examples>
>[2]  
>https://github.com/apache/flink/blob/master/flink-connectors/flink-connector-hive/src/test/java/org/apache/flink/connectors/hive/TableEnvHiveConnectorTest.java#L294
> 
><https://github.com/apache/flink/blob/master/flink-connectors/flink-connector-hive/src/test/java/org/apache/flink/connectors/hive/TableEnvHiveConnectorTest.java#L294>
>
>
>
>> 在 2020年5月28日,13:59,Zhou Zach <wander...@163.com> 写道:
>> 
>> 多谢指点,可以了。
>> 但是换成动态插入,有问题:
>> org.apache.flink.client.program.ProgramInvocationException: The main method 
>> caused an error: SQL parse failed. Encountered "p_year" at line 3, column 58.
>> Was expecting one of:
>>    "DATE" ...
>>    "FALSE" ...
>>    "INTERVAL" ...
>>    "NULL" ...
>>    "TIME" ...
>>    "TIMESTAMP" ...
>>    "TRUE" ...
>>    "UNKNOWN" ...
>>    <UNSIGNED_INTEGER_LITERAL> ...
>>    <APPROX_NUMERIC_LITERAL> ...
>>    <DECIMAL_NUMERIC_LITERAL> ...
>>    <BINARY_STRING_LITERAL> ...
>>    <QUOTED_STRING> ...
>>    <PREFIXED_STRING_LITERAL> ...
>>    <UNICODE_STRING_LITERAL> ...
>>    <LBRACE_D> ...
>>    <LBRACE_T> ...
>>    <LBRACE_TS> ...
>>    "+" ...
>>    "-" ...
>> 
>> 
>> at 
>> org.apache.flink.client.program.PackagedProgram.callMainMethod(PackagedProgram.java:335)
>> at 
>> org.apache.flink.client.program.PackagedProgram.invokeInteractiveModeForExecution(PackagedProgram.java:205)
>> at org.apache.flink.client.ClientUtils.executeProgram(ClientUtils.java:138)
>> at 
>> org.apache.flink.client.cli.CliFrontend.executeProgram(CliFrontend.java:664)
>> at org.apache.flink.client.cli.CliFrontend.run(CliFrontend.java:213)
>> at 
>> org.apache.flink.client.cli.CliFrontend.parseParameters(CliFrontend.java:895)
>> at 
>> org.apache.flink.client.cli.CliFrontend.lambda$main$10(CliFrontend.java:968)
>> at java.security.AccessController.doPrivileged(Native Method)
>> at javax.security.auth.Subject.doAs(Subject.java:422)
>> at 
>> org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1875)
>> at 
>> org.apache.flink.runtime.security.HadoopSecurityContext.runSecured(HadoopSecurityContext.java:41)
>> at org.apache.flink.client.cli.CliFrontend.main(CliFrontend.java:968)
>> 
>> 
>> 
>> 
>> Query:
>> tableEnv.sqlUpdate(
>>      """
>>        |
>>        |INSERT INTO dwdCatalog.dwd.t1_copy partition (`p_year` = p_year, 
>> `p_month` = p_month)
>>        |select id,name from dwdCatalog.dwd.t1 where `p_year` = 2020 and 
>> `p_month` = 4
>>        |
>>        |""".stripMargin)
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> 在 2020-05-28 13:39:49,"Leonard Xu" <xbjt...@gmail.com> 写道:
>>> Hi,
>>>>       |select * from dwdCatalog.dwd.t1 where `p_year` = 2020 and `p_month` 
>>>> = 5
>>> 
>>> 应该是 select * 会把分区字段一起带出来吧,你字段就不匹配了,select里加上你需要的字段吧
>>> 
>>> 祝好,
>>> Leonard Xu
>>> 
>>>> 在 2020年5月28日,12:57,Zhou Zach <wander...@163.com> 写道:
>>>> 
>>>> org.apache.flink.client.program.ProgramInvocationException: The main 
>>>> method caused an error: Field types of query result and registered 
>>>> TableSink dwdCatalog.dwd.t1_copy do not match.
>>>> 
>>>> Query schema: [id: BIGINT, name: STRING, p_year: INT, p_month: INT, 
>>>> EXPR$4: INT NOT NULL, EXPR$5: INT NOT NULL]
>>>> 
>>>> Sink schema: [id: BIGINT, name: STRING, p_year: INT, p_month: INT]
>>>> 
>>>> at 
>>>> org.apache.flink.client.program.PackagedProgram.callMainMethod(PackagedProgram.java:335)
>>>> 
>>>> at 
>>>> org.apache.flink.client.program.PackagedProgram.invokeInteractiveModeForExecution(PackagedProgram.java:205)
>>>> 
>>>> at org.apache.flink.client.ClientUtils.executeProgram(ClientUtils.java:138)
>>>> 
>>>> at 
>>>> org.apache.flink.client.cli.CliFrontend.executeProgram(CliFrontend.java:664)
>>>> 
>>>> at org.apache.flink.client.cli.CliFrontend.run(CliFrontend.java:213)
>>>> 
>>>> at 
>>>> org.apache.flink.client.cli.CliFrontend.parseParameters(CliFrontend.java:895)
>>>> 
>>>> at 
>>>> org.apache.flink.client.cli.CliFrontend.lambda$main$10(CliFrontend.java:968)
>>>> 
>>>> at java.security.AccessController.doPrivileged(Native Method)
>>>> 
>>>> at javax.security.auth.Subject.doAs(Subject.java:422)
>>>> 
>>>> at 
>>>> org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1875)
>>>> 
>>>> at 
>>>> org.apache.flink.runtime.security.HadoopSecurityContext.runSecured(HadoopSecurityContext.java:41)
>>>> 
>>>> at org.apache.flink.client.cli.CliFrontend.main(CliFrontend.java:968)
>>>> 
>>>> 
>>>> 
>>>> 
>>>> hive分区表:
>>>> CREATE TABLE `dwd.t1`(
>>>> `id` bigint, 
>>>> `name` string)
>>>> PARTITIONED BY ( 
>>>> `p_year` int, 
>>>> `p_month` int)
>>>> 
>>>> 
>>>> CREATE TABLE `dwd.t1_copy`(
>>>> `id` bigint, 
>>>> `name` string)
>>>> PARTITIONED BY ( 
>>>> `p_year` int, 
>>>> `p_month` int)
>>>> 
>>>> 
>>>> Flink sql:
>>>> tableEnv.sqlUpdate(
>>>>     """
>>>>       |
>>>>       |INSERT INTO dwdCatalog.dwd.t1_copy partition (`p_year` = 2020, 
>>>> `p_month` = 5)
>>>>       |select * from dwdCatalog.dwd.t1 where `p_year` = 2020 and `p_month` 
>>>> = 5
>>>>       |
>>>>       |""".stripMargin)
>>>> 
>>>> 
>>>> thanks for your help
>

回复