python篇 003-- influxdb 2.x 查询时将influxdb的数据整合成表,并转换成dataframe

influx -python -client 2.x 版本中, 放弃了  influxsql写法 采用 自家influx语法,使用python 使用pandas 获取数据的时候如果要转换成dataframe格式,可以采用read_dataframe方法,但是默认会dataframe是一个的时候会返回为list 在这里 就需要自己手动拼接, 可以采用内置方法进行转换。

    with InfluxDBClient(url=dbconf.HOST, token=dbconf.TOKEN, org=dbconf.ORG, debug=False) as client:
        global stopstamp,startstamp
        startstamp, stopstamp = dbconf.getlocaltime()
        query_api = client.query_api()
        query_str = 'import "timezone" option location = timezone.location(name: "Asia/Shanghai") '
        query_str += 'from(bucket: "' + dbconf.BUCKET + '")'
        query_str += ' |> range(start: ' + \
                     str(startstamp) + ', stop: ' + str(stopstamp) + ') '
        query_str += '|> filter(fn: (r) => r["_measurement"] == "' + \
                     dbconf.MEASUREMENTONE + '")'
        query_str += '|> filter(fn: (r) => r["_field"] == "RotateSpeed2_decimal" or  r["_field"] == "RotateSpeed1_decimal" or  r["_field"] == "Torque_decimal" or  r["_field"] == "EnvironmentTemp_decimal" or  r["_field"]  == "Mot2_speed_rpm_gui_int" or  r["_field"] == "AI_PhaseWCurrent2_gui_decimal" or  r["_field"] == "AI_PhaseWCurrent2_RMS_gui_decimal" or  r["_field"] == "AI_PhaseUCurrent2_RMS_gui_decimal" or  r["_field"] == "AI_PhaseUCurrent2_gui_decimal" or  r["_field"] == "AI_BusNegCurrent_gui_decimal" or r["_field"]== "AI_Motor2Temp1_gui_decimal")'
        query_str += '|> pivot(rowKey:["_time"], columnKey: ["_field"], valueColumn: "_value")'
        query_str += '|> yield()'
        print(query_str)
        tables = query_api.query(query_str, org=dbconf.ORG)
        data = pd.DataFrame()
        list_time = []
        RotateSpeed2_decimal_list = []
        RotateSpeed1_decimal_list = []
        Torque_decimal_list = []
        EnvironmentTemp_decimal_list = []
        Mot2_speed_rpm_gui_int_list = []
        AI_PhaseWCurrent2_gui_decimal_list = []
        AI_PhaseWCurrent2_RMS_gui_decimal_list = []
        AI_PhaseUCurrent2_RMS_gui_decimal_list = []
        AI_PhaseUCurrent2_gui_decimal_list = []
        AI_BusNegCurrent_gui_decimal_list = []
        AI_Motor2Temp1_gui_decimal_list = []
        for table in tables:
            for row in table.records:
                list_time.append(row.__getitem__(
                    '_time').strftime('%Y-%m-%dT%H:%M:%S.%fZ'))
                RotateSpeed2_decimal_list.append(
                    row.__getitem__('RotateSpeed2_decimal'))
                RotateSpeed1_decimal_list.append(
                    row.__getitem__('RotateSpeed1_decimal'))
                Torque_decimal_list.append(row.__getitem__('Torque_decimal'))
                EnvironmentTemp_decimal_list.append(
                    row.__getitem__('EnvironmentTemp_decimal'))
                Mot2_speed_rpm_gui_int_list.append(
                    row.__getitem__('Mot2_speed_rpm_gui_int'))
                AI_PhaseWCurrent2_gui_decimal_list.append(
                    row.__getitem__('AI_PhaseWCurrent2_gui_decimal'))
                AI_PhaseWCurrent2_RMS_gui_decimal_list.append(
                    row.__getitem__('AI_PhaseWCurrent2_RMS_gui_decimal'))
                AI_PhaseUCurrent2_RMS_gui_decimal_list.append(
                    row.__getitem__('AI_PhaseUCurrent2_RMS_gui_decimal'))
                AI_PhaseUCurrent2_gui_decimal_list.append(
                    row.__getitem__('AI_PhaseUCurrent2_gui_decimal'))
                AI_BusNegCurrent_gui_decimal_list.append(
                    row.__getitem__('AI_BusNegCurrent_gui_decimal'))
                AI_Motor2Temp1_gui_decimal_list.append(
                    row.__getitem__('AI_Motor2Temp1_gui_decimal'))
        data['time'] = list_time
        data['RotateSpeed2_decimal'] = RotateSpeed2_decimal_list
        data['RotateSpeed1_decimal'] = RotateSpeed1_decimal_list
        data['Torque_decimal'] = Torque_decimal_list
        data['EnvironmentTemp_decimal'] = EnvironmentTemp_decimal_list
        data['Mot2_speed_rpm_gui_int'] = Mot2_speed_rpm_gui_int_list
        data['AI_PhaseWCurrent2_gui_decimal'] = AI_PhaseWCurrent2_gui_decimal_list
        data['AI_PhaseWCurrent2_RMS_gui_decimal'] = AI_PhaseWCurrent2_RMS_gui_decimal_list
        data['AI_PhaseUCurrent2_RMS_gui_decimal'] = AI_PhaseUCurrent2_RMS_gui_decimal_list
        data['AI_PhaseUCurrent2_gui_decimal'] = AI_PhaseUCurrent2_gui_decimal_list
        data['AI_BusNegCurrent_gui_decimal'] = AI_BusNegCurrent_gui_decimal_list
        data['AI_Motor2Temp1_gui_decimal'] = AI_Motor2Temp1_gui_decimal_list

其中 通过 

|> pivot(rowKey:["_time"], columnKey: ["_field"], valueColumn: "_value")

就可以将influxdb的查询数据整合到一个表中。

然后 通过 pd.DataFrame() 新建一个dataframe 包裹该list 就可以了 。 

官方的 query_data_frame 中 其实有过判断 如果是 单个dataframe 会自动返回 一个list

如果对速度要求不是很快的话可以采用上述的这种写法。 

下面是 官方的代码 

        from ..extras import pd

        _generator = self.query_data_frame_stream(query, org=org, data_frame_index=data_frame_index, params=params)
        _dataFrames = list(_generator)

        if len(_dataFrames) == 0:
            return pd.DataFrame(columns=[], index=None)
        elif len(_dataFrames) == 1:
            return _dataFrames[0]
        else:
            return _dataFrames

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
第一章 整体介绍 2 1.1 什么是 Table API 和 Flink SQL 2 1.2 需要引入的依赖 2 1.3 两种 planner(old & blink)的区别 4 第二章 API 调用 5 2.1 基本程序结构 5 2.2 创建表环境 5 2.3 在 Catalog 中注册表 7 2.3.1 表(Table)的概念 7 2.3.2 连接到文件系统(Csv 格式) 7 2.3.3 连接到 Kafka 8 2.4 表的查询 9 2.4.1 Table API 的调用 9 2.4.2 SQL 查询 10 2.5 将 DataStream 转换成表 11 2.5.1 代码表达 11 2.5.2 数据类型与 Table schema 的对应 12 2.6. 创建临时视图(Temporary View) 12 2.7. 输出表 14 2.7.1 输出到文件 14 2.7.2 更新模式(Update Mode) 15 2.7.3 输出到 Kafka 16 2.7.4 输出到 ElasticSearch 16 2.7.5 输出到 MySql 17 2.8 将表转换 DataStream 18 2.9 Query 的解释和执行 20 1. 优化查询计划 20 2. 解释 DataStream 或者 DataSet 程序 20 第三章 流处理中的特殊概念 20 3.1 流处理和关系代数(表,及 SQL)的区别 21 3.2 动态表(Dynamic Tables) 21 3.3 流式持续查询的过程 21 3.3.1 将流转换成表(Table) 22 3.3.2 持续查询(Continuous Query) 23 3.3.3 将动态表转换流 23 3.4 时间特性 25 3.4.1 处理时间(Processing Time) 25 3.4.2 事件时间(Event Time) 27 第四章 窗口(Windows) 30 4.1 分组窗口(Group Windows) 30 4.1.1 滚动窗口 31 4.1.2 滑动窗口 32 4.1.3 会话窗口 32 4.2 Over Windows 33 1) 无界的 over window 33 2) 有界的 over window 34 4.3 SQL 中窗口的定义 34 4.3.1 Group Windows 34 4.3.2 Over Windows 35 4.4 代码练习(以分组滚动窗口为例) 36 第五章 函数(Functions) 38 5.1 系统内置函数 38 5.2 UDF 40 5.2.1 注册用户自定义函数 UDF 40 5.2.2 标量函数(Scalar Functions) 40 5.2.3 表函数(Table Functions) 42 5.2.4 聚合函数(Aggregate Functions) 45 5.2.5 表聚合函数(Table Aggregate Functions) 47
以下是使用Spark SQL将student.txt数据写入MySQL的代码: ```scala // 1.创建SparkSession对象 val spark = SparkSession.builder() .appName("Write to MySQL") .master("local[*]") .getOrCreate() // 2.读取数据 val lines = spark.sparkContext.textFile("path/to/student.txt") // 3.切分每一行, 4.RDD关联Student val students = lines.map(line => { val fields = line.split(",") Student(fields(0), fields(1), fields(2), fields(3), fields(4), fields(5), fields(6), fields(7)) }) // 5.将RDD转换DataFrame val studentDF = students.toDF() // 6.将DataFrame注册成表 studentDF.createOrReplaceTempView("student") // 7.操作student表 ,按照年龄进行降序排列 val resultDF = spark.sql("SELECT * FROM student ORDER BY s_birthday DESC") // 8.把结果保存在mysql表中 // (1)创建Properties对象,配置连接MySQL的用户名和密码 val prop = new Properties() prop.setProperty("user", "root") prop.setProperty("password", "123456") // (2)写入MySQL时,可以配置插入mode,overwrite覆盖,append追加,ignore忽略,error resultDF.write.mode(SaveMode.Append).jdbc("jdbc:mysql://localhost:3306/test", "student", prop) ``` 其中,`Student`样例类的定义如下: ```scala case class Student(s_id: String, s_name: String, s_sex: String, s_birthday: String, s_class: String, s_specialty: String, s_school: String, s_register_time: String) ``` 在代码中,我们首先通过`SparkSession`对象创建了一个本地运行的Spark应用程序,然后读取了`student.txt`文件中的数据,并将每一行切分一个个字段,再将其关联到一个名为`Student`的样例类中。接着,我们将这些`Student`对象转换一个DataFrame,并将其注册为一个名为`student`的表。在这个表上,我们执行了一个按照`birthday`字段降序排列的查询,并将结果保存在了MySQL表`student`中。 在将结果保存到MySQL表时,我们通过`Properties`对象设置了连接MySQL的用户名和密码,并指定了写入模式为追加(`SaveMode.Append`)。这表示如果表已经存在,则将新的数据追加到表的末尾;如果表不存在,则会自动创建一个新表。如果需要覆盖原有表的数据,则可以将写入模式设为`overwrite`,如果要忽略重复数据,则可以将模式设为`ignore`,如果要在遇到重复数据时抛出异常,则可以将模式设为`error`。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhogjiane

人生苦短

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值