转载--Flink sql 按时间分区写入到本地文件,hdfs文件

 

详情请看:https://www.aboutyun.com/forum.php?mod=viewthread&tid=29104

直接上代码:

已经验证过json paquet 等数据格式写入,在本地磁盘生成了文件。要注意的是要注意导入依赖:

package flinksql;



import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.functions.source.SourceFunction;
import org.apache.flink.table.api.EnvironmentSettings;
import org.apache.flink.table.api.bridge.java.StreamTableEnvironment;

import java.sql.Timestamp;

/**
 * @author zhangjun 欢迎关注我的公众号[大数据技术与应用实战],获取更多精彩实战内容
 * <p>
 * 流式数据以sql的形式写入file
 */
public class StreamingWriteFile {
   public static void main(String[] args) throws Exception{

      StreamExecutionEnvironment bsEnv = StreamExecutionEnvironment.getExecutionEnvironment();
      EnvironmentSettings bsSettings = EnvironmentSettings.newInstance().useBlinkPlanner().inStreamingMode().build();
      bsEnv.enableCheckpointing(10000);
      StreamTableEnvironment bsTableEnv = StreamTableEnvironment.create(bsEnv, bsSettings);
      DataStream<UserInfo> dataStream = bsEnv.addSource(new MySource());
      String sql = "CREATE TABLE fs_table (\n" +
                   "  user_id STRING,\n" +
                   "  order_amount DOUBLE,\n" +
                   "  dt STRING," +
                   "  h string," +
                   "  m string  \n" +
                   ") PARTITIONED BY (dt,h,m) WITH (\n" +
                   "  'connector'='filesystem',\n" +
                   "  'path'='file:///G:\\汪小剑的文件夹\\flink_test\\',\n" +
                   "  'format'='json'\n" +
                   ")";
      bsTableEnv.executeSql(sql);
      bsTableEnv.createTemporaryView("users", dataStream);
      String insertSql = "insert into  fs_table SELECT userId, amount, " +
                         " DATE_FORMAT(ts, 'yyyy-MM-dd'), DATE_FORMAT(ts, 'HH'), DATE_FORMAT(ts, 'mm') FROM users";

      bsTableEnv.executeSql(insertSql);

   }

   public static class MySource implements SourceFunction<UserInfo>{

      String userids[] = {
            "4760858d-2bec-483c-a535-291de04b2247", "67088699-d4f4-43f2-913c-481bff8a2dc5",
            "72f7b6a8-e1a9-49b4-9a0b-770c41e01bfb", "dfa27cb6-bd94-4bc0-a90b-f7beeb9faa8b",
            "aabbaa50-72f4-495c-b3a1-70383ee9d6a4", "3218bbb9-5874-4d37-a82d-3e35e52d1702",
            "3ebfb9602ac07779||3ebfe9612a007979", "aec20d52-c2eb-4436-b121-c29ad4097f6c",
            "e7e896cd939685d7||e7e8e6c1930689d7", "a4b1e1db-55ef-4d9d-b9d2-18393c5f59ee"
      };

      @Override
      public void run(SourceContext<UserInfo> sourceContext) throws Exception{
         while (true){
            String userid = userids[(int) (Math.random() * (userids.length - 1))];
            UserInfo userInfo = new UserInfo();
            userInfo.setUserId(userid);
            userInfo.setAmount(Math.random() * 100);
            userInfo.setTs(new Timestamp(System.currentTimeMillis()));
            sourceContext.collect(userInfo);
            Thread.sleep(100);
         }
      }

      @Override
      public void cancel(){

      }
   }

   public static class UserInfo implements java.io.Serializable{
      private String userId;
      private Double amount;
      private Timestamp ts;

      public String getUserId(){
         return userId;
      }

      public void setUserId(String userId){
         this.userId = userId;
      }

      public Double getAmount(){
         return amount;
      }

      public void setAmount(Double amount){
         this.amount = amount;
      }

      public Timestamp getTs(){
         return ts;
      }

      public void setTs(Timestamp ts){
         this.ts = ts;
      }
   }
}

 

FlinkSQL 在hive中创建空表

// TODO: 2020/7/13 创建表
String hiveSql = "CREATE external TABLE test_table (\n" +
        "  aaa STRING,\n" +
        "  bbb DOUBLE" +
        ") partitioned by (dt string,h string,m string) " +
        "stored as ORC " +
        "TBLPROPERTIES (\n" +
        "  'partition.time-extractor.timestamp-pattern'='$dt $h:$m:00',\n" +
        "  'sink.partition-commit.delay'='0s',\n" +
        "  'sink.partition-commit.trigger'='partition-time',\n" +
        "  'sink.partition-commit.policy.kind'='metastore'" +
        ")";
tEnv.executeSql(hiveSql);

 

### 回答1: 我可以提供一些建议:首先,使用Flink SQL编写代码,然后使用Hive建立外表。接下来,可以使用'CREATE EXTERNAL TABLE'语句来定义外表。最后,通过在Hive中注册外表,可以完成对Hive外表的建立。 ### 回答2: 要使用Flink SQL在Hive中创建外部表,你可以按照以下步骤操作: 1. 首先,确保你已经安装了Flink,并且Flink的SQL客户端已经启动。 2. 在Flink SQL客户端中,执行以下命令来创建Hive表的外部表: CREATE EXTERNAL TABLE hive_external_table ( col1 INT, col2 STRING ) STORED AS PARQUET LOCATION '<HDFS_path_to_parquet_files>'; 在上述命令中,你需要指定外部表的名称(hive_external_table)以及表中的列名和数据类型。同时,你还需要指定外部表存储的文件格式,这里我们使用的是Parquet格式。最后,你需要指定外部表存储在HDFS上的位置,即<HDFS_path_to_parquet_files>。 3. 接下来,你需要将Flink的查询结果写入到Hive的外部表中。你可以使用类似如下的代码将数据写入外部表: INSERT INTO hive_external_table SELECT col1, col2 FROM flink_source_table; 在上述代码中,flink_source_table是Flink中的源表,它包含了要写入到Hive外部表中的数据。通过将查询结果插入到外部表中,你就能将Flink SQL的结果保存到Hive中的外部表中了。 需要注意的是,Flink SQL默认的Hive版本是1.2.1。如果你使用的是不同的Hive版本,那么你可能需要在创建外部表时指定与你的Hive版本相匹配的存储格式和语法。 希望以上步骤能够帮助你成功地使用Flink SQL创建Hive的外部表。 ### 回答3: 要生产 Flink SQL 代码建立 Hive 外表,可以按照以下步骤进行操作: 1. 首先,你需要在 Hive 中创建一个外部表。可以使用 Hive SQL 语句来定义外部表的结构,并指定数据的存储位置和格式。例如,使用如下的 Hive SQL 语句创建一个外部表: ``` CREATE EXTERNAL TABLE IF NOT EXISTS my_external_table ( column1 INT, column2 STRING ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE LOCATION '/path/to/data'; ``` 在上述示例中,`my_external_table` 是外部表的名称,`column1` 和 `column2` 是表的列定义,`ROW FORMAT DELIMITED` 指定行格式为逗号分隔,`STORED AS TEXTFILE` 指定数据以文本文件形式存储,`LOCATION` 指定数据的存储路径。 2. 接下来,你需要使用 Flink SQL 编写代码来建立 Hive 外部表,以便 Flink 可以与之进行交互。在 Flink SQL 代码中,你可以使用 `CREATE TABLE` 语句来定义外部表的结构和元数据,以与 Hive 中的外部表一致。例如,使用如下的 Flink SQL 代码建立 Hive 外部表: ``` CREATE TABLE my_external_table ( column1 INT, column2 STRING ) WITH ( 'connector' = 'filesystem', 'path' = '/path/to/data', 'format' = 'csv', 'csv.field-delimiter' = ',', 'hive-table-name' = 'my_external_table', 'hive-partition-keys' = '', 'hive-partition-values' = '' ); ``` 在上述示例中,`my_external_table` 是外部表的名称,`column1` 和 `column2` 是表的列定义,`connector` 指定连接器类型为文件系统,`path` 指定数据的路径,`format` 指定数据的格式为 CSV,`csv.field-delimiter` 指定字段分隔符为逗号,`hive-table-name` 指定 Hive 外部表的名称,`hive-partition-keys` 和 `hive-partition-values` 这两个参数用于指定分区的键和值。 通过以上步骤,你就可以使用 Flink SQL 代码建立 Hive 外部表了。在建立外部表后,你可以使用 Flink SQL 进行数据操作和分析,同时也可以在 Hive 中使用外部表进行数据查询和处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值