Flink Table和SQL的表和视图、Connectors和timestamp数据类型

1. 表和视图

表分为临时表和永久表,相同名称下,临时表的优先级比永久表高
永久表需要数据库保存元数据,例如Hive数据库

连接外部数据系统通常用createTemporaryTable,中间结果表通常用createTemporatyView,如下所示:

tEnv.createTemporaryTable("table_name", tableDescriptor)
tEnv.createTemporaryView("table_name", table)

2. Table API Connectors

2.1 filesystem、print、blackhole

添加pom.xml依赖

        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-csv</artifactId>
            <version>1.14.3</version>
            <scope>provided</scope>
        </dependency>


        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>3.3.1</version>
            <scope>provided</scope>
        </dependency>

程序如下:

import org.apache.flink.api.common.RuntimeExecutionMode
import org.apache.flink.streaming.api.functions.sink.DiscardingSink
import org.apache.flink.streaming.api.scala.StreamExecutionEnvironment
import org.apache.flink.table.api.bridge.scala.StreamTableEnvironment
import org.apache.flink.table.api.{DataTypes, FormatDescriptor, Schema, TableDescriptor, long2Literal, row, string2Literal}
import org.apache.flink.types.Row
import org.apache.hadoop.conf.Configuration
import org.apache.hadoop.fs.FileSystem
import org.apache.hadoop.ipc.StandbyException

import scala.util.control.Breaks.{break, breakable}




object flink_test {

  // 获取Active HDFS Uri
  def getActiveHdfsUri() = {
    val hadoopConf = new Configuration()
    val hdfsUris = Array(
      "hdfs://192.168.23.101:8020",
      "hdfs://192.168.23.102:8020",
      "hdfs://192.168.23.103:8020"
    )
    var hdfsCli: FileSystem = null
    var hdfsCapacity: Long = -1L
    var activeHdfsUri: String = null

    breakable {
      for (hdfsUri <- hdfsUris) {
        hadoopConf.set("fs.defaultFS", hdfsUri)
        hdfsCli = FileSystem.get(hadoopConf)

        try {
          hdfsCapacity = hdfsCli.getStatus.getCapacity
          activeHdfsUri = hdfsUri
          break
        } catch {
          case hdfsException: StandbyException => {}
        }

      }
    }

    activeHdfsUri

  }

  def main(args: Array[String]): Unit = {


    val senv = StreamExecutionEnvironment.getExecutionEnvironment
    senv.setRuntimeMode(RuntimeExecutionMode.STREAMING)
    val tEnv = StreamTableEnvironment.create(senv)

    val hdfsFilePath = s"${getActiveHdfsUri()}/test/test.txt"

    // HDFS表
    val fileSystemTable = tEnv.from(
      TableDescriptor.forConnector("filesystem")
        .schema(Schema.newBuilder()
          .column("name", DataTypes.STRING())
          .column("amount", DataTypes.BIGINT())
          .build()
        )
        .option("path", hdfsFilePath)
        .format(FormatDescriptor
          .forFormat("csv")
          .option("field-delimiter", ",")
          .build()
        ).build()
    )
    tEnv.createTemporaryView("fileSystemTable", fileSystemTable)

    // print表
    tEnv.createTemporaryTable("printSink",
      TableDescriptor.forConnector("print")
        .schema(Schema.newBuilder()
          .column("name", DataTypes.STRING())
          .column("amount", DataTypes.BIGINT())
          .build()
        ).build()
    )

    // 读取HDFS表数据用print输出, 输出结果和转换成DataStream进行print一样
    fileSystemTable.executeInsert("printSink")

    // blackhole表
    tEnv.executeSql("create temporary table blackholeSink with ('connector' = 'blackhole') like printSink")

    // 读取HDFS表数据到blackhole
    tEnv.executeSql("insert into blackholeSink select * from fileSystemTable")

    // 转换为DataStream, 输出到blackhole
    val fileSystemDatastream = tEnv.toDataStream(fileSystemTable)
    fileSystemDatastream.addSink(new DiscardingSink[Row]())

    senv.execute()

  }
}

执行结果如下:

6> +I[zhang_san, 30]
4> +I[li_si, 40]

3. timestamp和timestamp_ltz

  1. timestamp(p)
    p指小数秒的精度,范围为0-9,默认是6
    val table = tEnv.sqlQuery("select timestamp '1970-01-01 00:00:04.001'")

    table.execute().print()

输出如下:

+----+-------------------------+
| op |                  EXPR$0 |
+----+-------------------------+
| +I | 1970-01-01 00:00:04.001 |
+----+-------------------------+
  1. timestamp_ltz(p)
    用于描述时间线上的绝对时间点, 使用long保存从epoch至今的毫秒数,使用int保存毫秒中的纳秒数
    无法通过字符串来指定, 可以通过一个long类型的epoch时间来转化。在同一个时间点, 全世界所有的机器上执行System.currentTimeMillis()都会返回同样的值
    tEnv.executeSql("create view t1 as select to_timestamp_ltz(4001, 3)")
    val table = tEnv.sqlQuery("select * from t1")

    table.execute().print()

输出如下:

+----+-------------------------+
| op |                  EXPR$0 |
+----+-------------------------+
| +I | 1970-01-01 08:00:04.001 |
+----+-------------------------+
  1. 各种当前时间函数
    tEnv.executeSql("create view myView1 as select localtime, localtimestamp, current_date, current_time, current_timestamp, current_row_timestamp(), now(), proctime()")
    val table = tEnv.sqlQuery("select * from myView1")
    table.printSchema()

    table.execute().print()

输出如下:

(
  `localtime` TIME(0) NOT NULL,
  `localtimestamp` TIMESTAMP(3) NOT NULL,
  `current_date` DATE NOT NULL,
  `current_time` TIME(0) NOT NULL,
  `current_timestamp` TIMESTAMP_LTZ(3) NOT NULL,
  `EXPR$5` TIMESTAMP_LTZ(3) NOT NULL,
  `EXPR$6` TIMESTAMP_LTZ(3) NOT NULL,
  `EXPR$7` TIMESTAMP_LTZ(3) NOT NULL *PROCTIME*
)
+----+-----------+-------------------------+--------------+--------------+-------------------------+-------------------------+-------------------------+-------------------------+
| op | localtime |          localtimestamp | current_date | current_time |       current_timestamp |                  EXPR$5 |                  EXPR$6 |                  EXPR$7 |
+----+-----------+-------------------------+--------------+--------------+-------------------------+-------------------------+-------------------------+-------------------------+
| +I |  12:59:06 | 2022-02-07 12:59:06.859 |   2022-02-07 |     12:59:06 | 2022-02-07 12:59:06.859 | 2022-02-07 12:59:06.859 | 2022-02-07 12:59:06.859 | 2022-02-07 12:59:06.862 |
+----+-----------+-------------------------+--------------+--------------+-------------------------+-------------------------+-------------------------+-------------------------+
### 回答1: Flink 1.14的Table API和SQL教程可以在Flink官方文档中找到,其中包括了Table API和SQL的基础概念、语法、操作符、函数等内容,还有详细的示例代码和实战案例,非常适合初学者学习和入门。另外,Flink社区也有很多优秀的博客和视频教程,可以帮助大家更深入地理解和应用Table API和SQL。 ### 回答2: Flink是一个分布式计算引擎,是Apache Hadoop生态圈中用于处理流式数据的一种解决方案。Flink支持格API和SQL语言,使得用户可以更加简单地实现流处理任务。而在Flink 1.14中,TableAPI和SQL引擎则得到了进一步的增强。 TableAPI和SQL将无需掌握Java或Scala编程语言就可以操作格数据。TableAPI API支持Java和Scala,SQL则支持标准的SQL语言。如果你熟悉SQL语言,那么你很容易上手使用TableAPI和SQL引擎。 Flink TableAPI和SQL支持各种类型的格操作,包括选择、过滤、分组、排序、连接等。此外,它们还支持窗口和聚合操作。这使得用户在处理流式数据时可以更加简单易懂地进行复杂的操作。 在Flink 1.14中,TableAPI和SQL引擎还提供了一系列新功能,包括: 1. 时间特征支持——TableAPI和SQL中的数据时间戳可以通过时间特征进行定义和控制。通过时间特征,用户可以定义数据的时间属性,例如事件时间或处理时间。 2. 详细的窗口管理——当窗口中的数据到期时,Flink 1.14会自动清除过期数据,避免数据量过大导致性能下降。 3. 支持更多的流数据源——在Flink 1.14中,TableAPI和SQL引擎可以直接从Kafka、Kinesis、Hive等数据源中读取数据。这可以让用户更加方便地读取数据,而无需编写额外的代码。 TableAPI和SQL引擎对于Flink用户来说是非常重要的工具,无需掌握Java或Scala编程语言即可操作格数据。并且在Flink 1.14中,这两个工具得到了进一步的增强,包括更好的窗口管理和更多的数据源支持。因此,学习TableAPI和SQL引擎对于想要使用Flink进行流处理的人来说是非常有益的。 ### 回答3: Flink 1.14 TableAPI和SQL是一个非常好用的数据处理工具,可帮助数据分析师快速进行数据查询、聚合和处理。下面详细介绍一下Flink 1.14的TableAPI和SQL教程。 1. 如何配置Flink 1.14的TableAPI和SQL环境? 在进行Flink 1.14的TableAPI和SQL开发之前,需要先进行环境的配置。可以在官网下载Flink的安装包,解压后找到/bin目录下的start-cluster.sh脚本进行启动。启动之后,即可通过WebUI的页面查看Flink的运行状态。 2. TableAPI的基本操作 TableAPI是Flink的一个高层次数据处理API,可以通过编写代码来进行数据的处理。TableAPI的基本操作有以下几个: (1) 创建Table,可以使用StreamTableEnvironment的fromDataStream或fromTableSource方法,将DataStream或TableSource转换成Table。 (2) Table的转换,可以使用多种转换操作,包括filter、select、orderBy、groupBy、join等。 (3) 将Table转化为DataStream,可以使用StreamTableEnvironment的toDataStream方法。 3. SQL的基本操作 SQLFlink提供的一种快速数据处理方式,用户只需要编写SQL语句即可完成数据处理。SQL的基本操作有以下几个: (1) 注册Table,可以使用StreamTableEnvironment的registerTable或registerTableSource方法,将TableTableSource注册到环境中。 (2) 执行SQL,可以使用StreamTableEnvironment的executeSql方法,执行SQL语句并返回结果。 (3) 将结果转换为DataStream,可以使用StreamTableEnvironment的toDataStream方法。 4. 如何优化Flink 1.14的TableAPI和SQL的执行效率? 在进行TableAPI和SQL开发时,为了保证其执行效率,需要注意以下几点: (1) 避免使用复杂的JOIN操作,可以使用Broadcast和TableFunction等方式来避免JOIN操作。 (2) 注意Table的Schema定义,Schema的设计合理与否直接影响SQL性能。 (3) 避免使用无限制的聚合操作,可以进行分批次聚合来避免。 总的来说,Flink 1.14的TableAPI和SQL是非常强大的数据处理工具,能够帮助开发者快速高效的进行数据处理。上述内容是入门级别的教程,如果想要更深入的了解,可以参考官方文档进行学习。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值