使用函数计算对表格存储中数据做简单清洗

摘要: 表格存储的增量数据流功能能够使用户使用API获取Table Store表中增量数据,并可以进行增量数据流的实时增量分析、数据增量同步等。通过创建Table Store触发器,能够实现Table Store Stream和函数计算的自动对接,让计算函数中自定义的程序逻辑自动处理Table Store表中发生的数据修改,充分的利用了函数计算全托管、弹性伸缩的特点。

函数计算(Function Compute) 是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。函数计算准备计算资源,并以弹性伸缩的方式运行用户代码,而用户只需根据实际代码运行所消耗的资源进行付费。

Table Store Stream是用于获取Table Store表中增量数据的一个数据通道,通过创建Table Store触发器,能够实现Table Store Stream和函数计算的自动对接,让计算函数中自定义的程序逻辑自动处理Table Store表中发生的数据修改。

表格存储高并发的写入性能以及低廉的存储成本非常适合物联网、日志、监控数据的存储,我们可以将数据写入到表格存储中,同时在函数计算中对新增的数据做简单的清洗、转换、聚合计算等操作,并将清洗之后的数据写回到表格存储的结果表中,并对原始明细数据及结果数据提供实时访问。

下面,我们使用函数计算对表格存储中的数据做简单的清洗,并写入到结果表中。

数据定义

我们假设写入的为日志数据,包括三个基础字段:

字段名称类型含义
id整型日志id
level整型日志的等级,越大表明等级越高
message字符串日志的内容

我们需要将 level>1 的日志写入到另外一张数据表中,用作专门的查询。

实现过程:

创建实例及数据表

表格存储的控制台创建表格存储实例(__本次以 华东2 distribute-test 为例__),并创建源表(__source_data__)及结果表(__result__),主键为均 __id (整型)__,由于表格存储是 schemafree 结构,无需预先定义其他属性列字段。

开启数据源表的Stream功能

触发器功能需要先开启数据表的Stream功能,才能在函数计算中处理写入表格存储中的增量数据。

Stream记录过期时长 为通过 StreamAPI 能够读取到的增量数据的最长时间。

由于触发器只能绑定现有的函数,故先到函数计算的控制台上在同region创建服务及函数。

创建函数计算服务

函数计算的控制台上创建服务及处理函数,我们继续使用华东2节点。

1.在华东2节点创建服务。

2.创建函数依次选择:空白函数——不创建触发器。

  • 函数名称为:etl_test,选择 python2.7 环境,在线编辑代码
  • 函数入口为:etl_test.handler
  • 代码稍后编辑,点击下一步。

3.进行服务授权

由于函数计算需要将运行中的日志写入到日志服务中,同时,需要对表格存储的表进行读写,故需要对函数计算进行授权,为方便起见,我们先添加 AliyunOTSFullAccess 与 __AliyunLogFullAccess __权限,实际生产中,建议根据权限最小原则来添加权限。

4.点击授权完成,并创建函数。

5.修改函数代码。

创建好函数之后,点击对应的函数代码执行,编辑代码并保存,其中,INSTANCE_NAME(表格存储的实例名称)、REGION(使用的区域)需要根据情况进行修改:

使用示例代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import cbor
import json
import tablestore as ots

INSTANCE_NAME = 'distribute-test'
REGION = 'cn-shanghai'
ENDPOINT = 'http://%s.%s.ots-internal.aliyuncs.com'%(INSTANCE_NAME, REGION)
RESULT_TABLENAME = 'result'


def _utf8(input):
    return str(bytearray(input, "utf-8"))

def get_attrbute_value(record, column):
    attrs = record[u'Columns']
    for x in attrs:
        if x[u'ColumnName'] == column:
            return x['Value']

def get_pk_value(record, column):
    attrs = record[u'PrimaryKey']
    for x in attrs:
        if x['ColumnName'] == column:
            return x['Value']

#由于已经授权了AliyunOTSFullAccess权限,此处获取的credentials具有访问表格存储的权限
def get_ots_client(context):
    creds = context.credentials
    client = ots.OTSClient(ENDPOINT, creds.accessKeyId, creds.accessKeySecret, INSTANCE_NAME, sts_token = creds.securityToken)
    return client

def save_to_ots(client, record):
    id = int(get_pk_value(record, 'id'))
    level = int(get_attrbute_value(record, 'level'))
    msg = get_attrbute_value(record, 'message')

    pk = [(_utf8('id'), id),]
    attr = [(_utf8('level'), level), (_utf8('message'), _utf8(msg)),]
    row = ots.Row(pk, attr)
    client.put_row(RESULT_TABLENAME, row)

def handler(event, context):
    records = cbor.loads(event)
    #records = json.loads(event)
    client = get_ots_client(context)
    for record in records['Records']:
        level = int(get_attrbute_value(record, 'level'))
        if level > 1:
            save_to_ots(client, record)
        else:
            print "Level <= 1, ignore."

对表格存储 Stream 数据的格式详情请参考Stream 数据处理

绑定触发器

1.回到表格存储的实例管理页面,点击表 source_data 后的 使用触发器 按钮,进入触发器绑定界面,点击使用已有函数计算, 选择刚创建的服务及函数,勾选 表格存储发送事件通知的权限, 进行确定。

2.绑定成功之后,能够看到如下的信息:

运行验证

1.向 source_data 表中写入数据。

2.在 result 表中查询清洗后的数据

点击 result 表的数据管理页面,会查询到刚写入到 source_data 中的数据。
当然,向 soure_data 写入level <=1的数据将不会同步到 result 表中

原文链接

### 回答1: 好的,我可以为您提供一些帮助。首先,您需要安装pathy库。您可以使用以下命令进行安装: ``` pip install pathy ``` 然后,您需要准备您的数据,并将其存储为一个列表或字典的形式。假设您的数据如下所示: ```python data = [ {"name": "Alice", "age": 25, "email": "alice@example.com"}, {"name": "Bob", "age": 30, "email": "bob@example.com"}, {"name": "Charlie", "age": 35, "email": "charlie@example.com"} ] ``` 接下来,您可以使用pathy库提供的`Path`类来创建一个Excel文件并写入数据。以下是一个示例代码: ```python from pathy import Path import pandas as pd # 准备数据 data = [ {"name": "Alice", "age": 25, "email": "alice@example.com"}, {"name": "Bob", "age": 30, "email": "bob@example.com"}, {"name": "Charlie", "age": 35, "email": "charlie@example.com"} ] # 创建Excel文件并写入数据 path = Path("data.xlsx") with pd.ExcelWriter(path) as writer: df = pd.DataFrame(data) df.to_excel(writer, index=False) print(f"数据已写入文件:{path}") ``` 在上面的代码,我们首先创建了一个`Path`对象,表示我们要创建的Excel文件的路径和名称。然后,我们使用`pd.ExcelWriter`创建一个`ExcelWriter`对象,该对象可以将数据写入Excel文件。我们将数据转换为一个`DataFrame`对象并使用`to_excel`方法将其写入Excel文件。最后,我们打印一条消息,表示数据已成功写入文件。 希望这可以帮助到您。 ### 回答2: 使用Python的pandas库可以很方便地将数据清洗为Excel表格。如下是一个使用pandas库进行数据清洗并生成Excel表格的示例代码: 1. 首先,我们需要安装pandas库。在终端或命令提示符运行以下命令: ``` pip install pandas ``` 2. 导入所需的库: ```python import pandas as pd ``` 3. 读取数据源文件,比如一个CSV文件: ```python data = pd.read_csv('data.csv') ``` 4. 对数据进行清洗,比如删除不需要的列、重命名列、缺失值处理等: ```python # 删除不需要的列 data = data.drop(['Column1', 'Column2'], axis=1) # 重命名列 data = data.rename(columns={'Column3': 'NewColumn3', 'Column4': 'NewColumn4'}) # 缺失值处理 data = data.fillna(0) ``` 5. 将清洗后的数据保存为Excel表格: ```python data.to_excel('cleaned_data.xlsx', index=False) ``` 以上代码的`data.csv`是数据源文件,可以替换成自己的文件路径或文件名。清洗后的数据将保存为`cleaned_data.xlsx`文件。 通过以上步骤,我们可以使用`pandas`库对数据进行清洗,并将处理后的数据保存为Excel表格使用`pathy`库的实现与以上代码逻辑类似,只是在创建和保存文件路径时可以使用`pathy`库提供的方法。 ### 回答3: 使用pathy库可以将数据清洗为Excel表格。pathy是一个用于处理文件路径和文件操作的Python库,它可以用于创建、复制、重命名、删除文件以及创建、遍历、删除文件夹等。 要使用pathy将数据清洗为Excel表格,首先需要将数据整理成一个适合转换为Excel表格的格式,例如列表、字典等。然后可以通过pathy提供的函数和方法来创建Excel文件,并将数据写入到文件。 首先,需要导入pathy库: ```python from pathy import Path ``` 然后,可以使用Path函数来创建一个新的Excel文件: ```python path = Path('data.xlsx') path.touch() ``` 接下来,可以使用第三方库,如pandas来处理数据,并将处理后的数据写入到Excel文件。以pandas的DataFrame为例,假设有一个名为data的DataFrame,需要将它写入到Excel文件: ```python import pandas as pd # 假设有一个名为data的DataFrame data = pd.DataFrame({'Column1': [1, 2, 3], 'Column2': ['A', 'B', 'C']}) # 将DataFrame写入到Excel文件 data.to_excel(path) ``` 以上代码的to_excel方法将DataFrame写入到Excel文件,其path为之前创建的Excel文件路径。 通过以上步骤,就可以使用pathy将数据清洗为Excel表格。最后可以通过Excel软件打开表格文件,查看清洗后的数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值