首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >大数据挖掘实战-PyODPS基础操作

大数据挖掘实战-PyODPS基础操作

原创
作者头像
fanstuck
修改于 2024-11-27 02:03:43
修改于 2024-11-27 02:03:43
59700
代码可运行
举报
运行总次数:0
代码可运行

今日推荐:案例分享 | 大数据传输中的二进制加密方案

文章链接:https://cloud.tencent.com/developer/article/2465951

推荐原因:数据加密作为一种有效的保护手段,已经被广泛应用于各种数据传输场景中。在大数据时代,各种平台存储了大量的行为数据和用户信息,为了保证用户的隐私,数据安全作为数据治理的一部分,也被越来越多的人所提及。如何确保数据在传输过程中的机密性、成为了需要开发者需要考虑的难题。

前言

之前写过很多Spark和PySpark的项目和技术操作文章,主流框架基本就是Spark了,但是在最近很多大数据的朋友反应除了公司自研大数据平台部署Spark进行大数据计算之外,还有相当一部分公司采用了大数据托管方式依托云平台管理。

很多第三方平台都有自己的大数据工具以及代码工具库,因此本系列内容就是主要写PyODPS这个目前算是主流常用的大数据类PySpark库,主要依托于阿里云的DataWorks,可以直接在大数据开发MaxCompute使用PyODPS,十分方便数据挖掘。因此本系列将延展MaxComputer来进行一系列数据挖掘项目,有需求的不要错过。

PyODPS基础介绍

PyODPS是MaxCompute的Python版本的SDK,类似于Spark的PySpark。提供简单方便的Python编程,PyODPS提供了与ODPS命令行工具类似的功能,例如上传和下载文件、创建表、运行ODPS SQL查询等,同时提供了一些高级功能,如提交MapReduce任务、使用ODPS UDF等。

Python作为目前机器学习、AI模型开发的主流编程语言,提供了如NumPy、SciPy、Scikit-Learn、Matplotlib等丰富的科学计算、可视化库,用于数据科学和数据分析。同时支持TensorFlow、PyTorch、XGBoost、LightGBM等丰富的训练框架。

  • NumPy:用于N维数组对象运算。
  • Pandas:是一个包含数据帧的数据分析库。
  • Matplotlib:用于创建图形和图形的2D绘图库。
  • Scikit-Learn:用于数据分析和数据挖掘任务的算法。

PyODPS于2015年正式发布,作为MaxCompute的Python SDK,支持通过Python接口对MaxCompute数据进行相关操作。经过多个版本的迭代发展,目前PyODPS已支持DataFrame框架,同时提供类似Pandas的语法,内置聚合、排序、去重等数据操作算子

运行环境

PyODPS作为一个SDK,本身运行于各种客户端,包括PC、DataWorks(数据开发的PyODPS节点)或PAI Notebooks的运行环境。

和PySpark一样,如果只在本地单点执行,比如初始使用PyODPS的用户会试图把数据拉取到本地,处理完成后再上传到 MaxCompute上,很多时候这种方式是十分低效的,拉取数据到本地彻底丧失了MaxCompute的大规模并行能力的优势,也就是没有用到大数据集群的并行计算能力。按照官方的定义:

数据处理方式

描述

场景示例

拉取到本地处理(不推荐,易OOM)

例如DataWorks中的PyODPS节点,内置了PyODPS包以及必要的Python环境,是一个资源非常受限的客户端运行容器,并不使用MaxCompute计算资源,有较强的内存限制。

PyODPS提供了to_pandas接口,可以直接将MaxCompute数据转化成Pandas DataFrame数据结构,但这个接口只应该被用于获取小规模数据做本地开发调试使用,而不是用来大规模处理数据,因为使用这个接口会触发下载行为,将位于MaxCompute中的海量数据下载到本地,如果后续操作的都是本地的DataFrame,则丧失了MaxCompute 的大规模并行计算能力,且数据量稍大时,单机内存就很容易产生OOM。

提交到MaxCompute分布式执行(推荐)

推荐您合理利用PyODPS提供的分布式DataFrame功能,将主要的计算提交到MaxCompute分布式执行而不是在PyODPS客户端节点下载处理,这是正确使用PyODPS的关键。

推荐使用PyODPS DataFrame接口来完成数据处理。常见的需求,比如需要对每一行数据处理然后写回表,或者一行数据要拆成多行,都可以通过PyODPS DataFrame中的map或者apply实现,有些甚至只需要一行代码,足够高效与简洁,案例可参见使用自定义函数及Python第三方库。使用这些接口最终都会翻译成SQL到MaxCompute计算集群做分布式计算,并且本地几乎没有任何的内存消耗,相比于单机有很大的性能提升。

示例场景

用户需要通过分析每天产生的日志字符串来提取一些信息,有一个只有一列的表,类型是string,通过jieba分词可以将中文语句分词,然后再找到想要的关键词存储到信息表里。

低效处理代码demo:

代码语言:python
代码运行次数:1
运行
AI代码解释
复制
import jieba
t = o.get_table('word_split')
out = []
with t.open_reader() as reader:
    for r in reader:
        words = list(jieba.cut(r[0]))
        #
        # 处理逻辑,产生出 processed_data
        #
        out.append(processed_data)
out_t = o.get_table('words')
with out_t.open_writer() as writer:
    writer.write(out)

单机处理数据的思维,逐行读取数据,然后逐行处理数据,再逐行写入目标表。整个流程中,下载上传数据消耗了大量的时间,并且在执行脚本的机器上需要很大的内存处理所有的数据,特别是对于使用DataWorks节点的用户来说,很容易因为超过默认分配的内存值而导致OOM运行报错。

高效处理代码demo:

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
from odps.df import output
out_table = o.get_table('words')
df = o.get_table('word_split').to_df()

# 假定需要返回的字段及类型如下
out_names = ["word", "count"]
out_types = ["string", "int"]

@output(out_names, out_types)
def handle(row):
    import jieba
    words = list(jieba.cut(row[0]))
    #
    # 处理逻辑,产生出 processed_data
    #
    yield processed_data
df.apply(handle, axis=1).persist(out_table.name)

利用apply实现分布式执行:

  • 复杂逻辑都放在handle这个函数里,这个函数会被自动序列化到服务端作为UDF使用,在服务端调用执行,且因为handle服务端实际执行时也是对每一行进行处理的,所以逻辑上是没有区别的。不同的是,这样写的程序在提交到MaxCompute端执行时,有多台机器同时处理数据,可以节约很多时间。
  • 调用persist接口会将产生的数据直接写到另一张MaxCompute表中,所有的数据产生与消费都在 MaxCompute集群完成,也节约了本地的网络与内存。
  • 在这个例子中也使用到了三方包,MaxCompute是支持自定义函数中使用三方包的(示例中的jieba),所以无需担心代码改动带来的成本,您可以几乎不需要改动主要逻辑就可以享受到MaxCompute的大规模计算能力。

通过DataWorks使用PyODPS

本系列文章均通过DataWorks使用PyODPS,本地使用代码效果和文章代码一致。可以进入DataWorks的数据开发页面创建PyODPS节点。PyODPS节点分为PyODPS 2和PyODPS 3两种:

  • PyODPS 2底层Python语言版本为Python 2。
  • PyODPS 3底层Python语言版本为Python 3。

可根据实际使用的Python语言版本创建PyODPS节点:

  • 包支持限制
  • DataWorks的PyODPS节点缺少matplotlib等包,如下功能可能受限:
    • DataFrame的plot函数。
    • DataFrame自定义函数需要提交到MaxCompute执行。由于Python沙箱限制,第三方库只支持所有的纯粹Python库以及NumPy,因此不能直接使用Pandas。
    • DataWorks中执行的非自定义函数代码可以使用平台预装的NumPy和Pandas。不支持其他带有二进制代码的第三方包。
  • DataWorks的PyODPS节点不支持Python的atexit包,请使用try-finally结构实现相关功能。
  • 读取数据记录数限制

DataWorks的PyODPS节点中,options.tunnel.use_instance_tunnel默认设置为False,即默认情况下,最多读取一万条数据记录。如果需要读取更多数据记录,需全局开启instance tunnel,即需要手动将options.tunnel.use_instance_tunnel设置为True。

DataWorks的PyODPS节点中,将会包含一个全局变量odps或者o,即为ODPS入口。不需要手动定义ODPS入口,比如:

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
#查看表pyodps_iris是否存在
print(o.exist_table('pyodps_iris'))

表操作

让我们把目光聚焦于如何完成ODPS的一系列表操作上面,也就是了解如何使用达成最终效果的工具。

当前项目内的表操作

列出项目空间下的所有表:

o.list_tables()方法可以列出项目空间下的所有表:

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
list_tables(project=None, prefix=None, owner=None, schema=None, type=None, extended=False)

参数:

  • project (str) – 项目空间,如果没有指定项目空间则默认为默认空间
  • prefix (str) – 指定开头匹配字符
  • owner (str) –指定查询归属人所拥有的表
  • schema (str) – 指导shema
  • type (str) – 指定表的类型type
  • extended (bool) – 如果为True,则扩展表信息

返回:

tables in this project, filtered by the optional prefix and owner.

返回类型:

generator

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
for table in o.list_tables():
    print(table)

输出的信息包含表名<库名>.<表名>、类型<type>和表schema

可以通过prefix参数只列举给定前缀的表:

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
for table in o.list_tables(prefix="table_prefix"):
    print(table.name)

通过该方法获取的 Table 对象不会自动加载表名以外的属性,如果需要在列举表的同时读取这些属性,在 PyODPS 0.11.5 及后续版本中,可以为list_tables添加extended=True参数:

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
for table in o.list_tables(extended=True):
    print(table.name, table.creation_time,table.schema)

如果需要按类型列举表,可以指定type参数。不同类型的表列举方法如下:

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
managed_tables = list(o.list_tables(type="managed_table"))  # 列举内置表
external_tables = list(o.list_tables(type="external_table"))  # 列举外表
virtual_views = list(o.list_tables(type="virtual_view"))  # 列举视图
materialized_views = list(o.list_tables(type="materialized_view"))  # 列举物化视图

判断表是否存在

o.exist_table()方法可以判断表是否存在。

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
print(o.exist_table('pyodps_iris'))
# 返回True表示表pyodps_iris存在。

获取表

入口对象的o.get_table()方法可以获取表。

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
get_table(name, project=None, schema=None)
  • 获取表的schema信息。
代码语言:python
代码运行次数:0
运行
AI代码解释
复制
t = o.get_table('products')
print(t.schema)  # 获取表pyodps_iris的schema
  • 获取表列信息
代码语言:python
代码运行次数:0
运行
AI代码解释
复制
t = o.get_table('products')
print(t.schema.columns)  # table
  • 获取表的某个列信息。
代码语言:python
代码运行次数:0
运行
AI代码解释
复制
t = o.get_table('products')
print(t.schema['category'])  # 获取表products的sepallength列信息
  • 获取表的某个列的备注信息。
代码语言:python
代码运行次数:0
运行
AI代码解释
复制
t = o.get_table('products')
print(t.schema['category'].comment)  # 获取表products的category列的备注信息
  • 获取表的生命周期。
代码语言:python
代码运行次数:0
运行
AI代码解释
复制
t = o.get_table('products')
print(t.lifecycle)  # 获取表pyodps_iris的生命周期

-1代表永久存在

  • 获取表的创建时间。
代码语言:python
代码运行次数:0
运行
AI代码解释
复制
t = o.get_table('products')
print(t.creation_time)  # 获取表pyodps_iris的创建时间
  • 获取表是否是虚拟视图。
代码语言:python
代码运行次数:0
运行
AI代码解释
复制
t = o.get_table('products')
print(t.is_virtual_view)  # 获取表products是否是虚拟视图,返回False,表示不是。

跨项目的表操作

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
t = o.get_table('table_name', project='other_project')

其中other_project为所跨的项目,table_name为跨项目获取的表名称。

创建表的Schema

  • 通过表的列以及可选的分区进行初始化。
代码语言:python
代码运行次数:0
运行
AI代码解释
复制
from odps.models import Schema, Column, Partition
columns = [
    Column(name='num', type='bigint', comment='the column'),
    Column(name='num2', type='double', comment='the column2'),
]
partitions = [Partition(name='pt', type='string', comment='the partition')]
schema = Schema(columns=columns, partitions=partitions)

初始化后,您可获取字段信息、分区信息等。

  • 获取所有字段信息
代码语言:python
代码运行次数:0
运行
AI代码解释
复制
print(schema.columns)
  • 获取非分区字段名称
代码语言:python
代码运行次数:0
运行
AI代码解释
复制
print(schema.names)
  • 获取非分区字段类型
代码语言:python
代码运行次数:0
运行
AI代码解释
复制
print(schema.types)

使用Schema.from_lists()方法。该方法更容易调用,但无法直接设置列和分区的注释。

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
from odps.models import Schema
schema = Schema.from_lists(['num', 'num2'], ['bigint', 'double'], ['pt'], ['string'])
print(schema.columns)

创建表

可以使用o.create_table()方法创建表,使用方式有两种:使用表Schema方式、使用字段名和字段类型方式。同时创建表时表字段的数据类型有一定的限制条件,详情如下

使用表Schema创建表

使用表Schema创建表时,您需要先创建表的Schema,然后通过Schema创建表。

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
#创建表的schema
from odps.models import Schema
schema = Schema.from_lists(['num', 'num2'], ['bigint', 'double'], ['pt'], ['string'])

#通过schema创建表
table = o.create_table('my_new_table', schema)

#只有不存在表时,才创建表。
table = o.create_table('my_new_table', schema, if_not_exists=True)

#设置生命周期。
table = o.create_table('my_new_table', schema, lifecycle=7)

表创建完成后,您可以通过print(o.exist_table('my_new_table'))验证表是否创建成功,返回True表示表创建成功。

使用字段名及字段类型创建表

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
#创建分区表my_new_table,可传入(表字段列表,分区字段列表)。
table = o.create_table('my_new_table', ('num bigint, num2 double', 'pt string'), if_not_exists=True)

#创建非分区表my_new_table02。
table = o.create_table('my_new_table02', 'num bigint, num2 double', if_not_exists=True)

可通过exist_table来判定:

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
print(o.exist_table('my_new_table'))

使用字段名及字段类型创建表:新数据类型

未打开新数据类型开关时(默认关闭),创建表的数据类型只允许为BIGINT、DOUBLE、DECIMAL、STRING、DATETIME、BOOLEAN、MAP和ARRAY类型。如果需要创建TINYINT和STRUCT等新数据类型字段的表,可以打开options.sql.use_odps2_extension = True开关,示例如下。

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
from odps import options
options.sql.use_odps2_extension = True
table = o.create_table('my_new_table', 'cat smallint, content struct<title:varchar(100), body:string>')

同步表更新

当一个表被其他程序更新,例如改变了Schema,可以调用reload()方法同步表的更新。

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
#表schema变更
from odps.models import Schema
schema = Schema.from_lists(['num', 'num2'], ['bigint', 'double'], ['pt'], ['string'])

#通过reload()同步表更新
table = o.create_table('my_new_table', schema)
table.reload()

写入表数据

  • 使用入口对象的write_table()方法写入数据。
代码语言:python
代码运行次数:0
运行
AI代码解释
复制
records = [[111, 1.0],                 # 此处可以是list。
          [222, 2.0],
          [333, 3.0],
          [444, 4.0]]
o.write_table('my_new_table', records, partition='pt=test', create_partition=True)  #创建pt=test分区并写入数据
  • 每次调用write_table()方法,MaxCompute都会在服务端生成一个文件。该操作耗时较长,同时文件过多会降低后续的查询效率。因此建议在使用此方法时,一次性写入多组数据,或者传入一个生成器对象。
  • 调用write_table()方法向表中写入数据时会追加到原有数据中。PyODPS不提供覆盖数据的选项,如果需要覆盖数据,请手动清除原有数据。对于非分区表,需要调用table.truncate()方法;对于分区表,需要删除分区后再建立新的分区。

对表对象调用open_writer()方法写入数据。

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
t = o.get_table('my_new_table')
with t.open_writer(partition='pt=test02', create_partition=True) as writer:  #创建pt=test02分区并写入数据
    records = [[1, 1.0],                 # 此处可以是List。
              [2, 2.0],
              [3, 3.0],
              [4, 4.0]]
    writer.write(records)  # 这里Records可以是可迭代对象。

如果是多级分区表,写入示例如下。

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
t = o.get_table('test_table')
with t.open_writer(partition='pt1=test1,pt2=test2') as writer:  # 多级分区写法。
    records = [t.new_record([111, 'aaa', True]),   # 也可以是Record对象。
               t.new_record([222, 'bbb', False]),
               t.new_record([333, 'ccc', True]),
               t.new_record([444, '中文', False])]
    writer.write(records)

使用多进程并行写数据

每个进程写数据时共享同一个Session_ID,但是有不同的Block_ID。每个Block对应服务端的一个文件。主进程执行Commit,完成数据上传。

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
import random
from multiprocessing import Pool
from odps.tunnel import TableTunnel
def write_records(tunnel, table, session_id, block_id):
    # 对使用指定的ID创建Session。
    local_session = tunnel.create_upload_session(table.name, upload_id=session_id)
    # 创建Writer时指定Block_ID。
    with local_session.open_record_writer(block_id) as writer:
        for i in range(5):
            # 生成数据并写入对应Block。
            record = table.new_record([random.randint(1, 100), random.random()])
            writer.write(record)

if __name__ == '__main__':
    N_WORKERS = 3

    table = o.create_table('my_new_table', 'num bigint, num2 double', if_not_exists=True)
    tunnel = TableTunnel(o)
    upload_session = tunnel.create_upload_session(table.name)

    # 每个进程使用同一个Session_ID。
    session_id = upload_session.id

    pool = Pool(processes=N_WORKERS)
    futures = []
    block_ids = []
    for i in range(N_WORKERS):
        futures.append(pool.apply_async(write_records, (tunnel, table, session_id, i)))
        block_ids.append(i)
    [f.get() for f in futures]

    # 最后执行Commit,并指定所有Block。
    upload_session.commit(block_ids)

向表中插入一行记录

Record表示表的一行记录,对表对象调用new_record()方法即可创建一个新的Record。

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
t = o.get_table('test_table')
r = t.new_record(['val0', 'val1'])  # 值的个数必须等于表Schema的字段数。
r2 = t.new_record()     # 可以不传入值。
r2[0] = 'val0' # 通过偏移设置值。
r2['field1'] = 'val1'  # 通过字段名设置值。
r2.field1 = 'val1'  # 通过属性设置值。

print(record[0])  # 取第0个位置的值。
print(record['c_double_a'])  # 通过字段取值。
print(record.c_double_a)  # 通过属性取值。
print(record[0: 3])  # 切片操作。
print(record[0, 2, 3])  # 取多个位置的值。
print(record['c_int_a', 'c_double_a'])  # 通过多个字段取值。

获取表数据

获取表数据的方法有多种,常用方法如下:

  • 使用入口对象的read_table()方法。
代码语言:python
代码运行次数:0
运行
AI代码解释
复制
# 处理一条记录。
for record in o.read_table('my_new_table', partition='pt=test'):
    print(record)

如果仅需要查看每个表最开始的小于1万条数据,可以对表对象调用head()方法。

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
t = o.get_table('my_new_table')
# 处理每个Record对象。
for record in t.head(3):
    print(record)

调用open_reader()方法读取数据。

  • 使用with表达式的写法如下。
代码语言:python
代码运行次数:0
运行
AI代码解释
复制
from odps.models import Schema
t = o.get_table('my_new_table')
with t.open_reader(partition='pt=test') as reader:
    count = reader.count
    for record in reader:  # 可以执行多次,直到将Count数量的Record读完,此处可以改造成并行操作。
        print(record)  # 处理一条记录,例如打印记录本身

不使用with表达式的写法如下

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
reader = t.open_reader(partition='pt=test')
count = reader.count
for record in reader:  # 可以执行多次,直到将Count数量的Record读完,此处可以改造成并行操作。
    print(record)  # 处理一条记录,例如打印记录本身

删除表

使用delete_table()方法删除已经存在的表。

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
o.delete_table('my_table_name', if_exists=True)  # 只有表存在时,才删除表。
t.drop()  # Table对象存在时,直接调用Drop方法删除。

表分区

判断是否为分区表

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
#创建表的schema
from odps.models import Schema
table = o.get_table('my_new_table')
if table.schema.partitions:
    print('Table %s is partitioned.' % table.name)

遍历表全部分区

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
from odps.models import Schema
table = o.get_table('my_new_table')
for partition in table.partitions:  # 遍历所有分区
    print(partition.name)  # 具体的遍历步骤,这里是打印分区名
for partition in table.iterate_partitions(spec='pt=test'):  # 遍历 pt=test 分区下的二级分区
    print(partition.name)  # 具体的遍历步骤,这里是打印分区名
for partition in table.iterate_partitions(spec='dt>20230119'):  # 遍历 dt>20230119 分区下的二级分区
    print(partition.name)  # 具体的遍历步骤,这里是打印分区名

判断分区是否存在

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
table = o.get_table('my_new_table')
table.exist_partition('pt=test,sub=2015')

获取分区

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
#创建表的schema
from odps.models import Schema
table = o.get_table('my_new_table')
partition = table.get_partition('pt=test01')
print(partition.creation_time)
print(partition.size)

删除分区

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
t = o.get_table('my_new_table')
t.delete_partition('pt=test', if_exists=True)  # 自定if_exists参数,分区存在时才删除分区。
partition.drop()  # 分区对象存在时,直接对分区对象调用Drop方法删除。

数据上传下载通道

Tunnel是MaxCompute的数据通道,用户可以通过Tunnel向MaxCompute中上传或者下载数据。

上传数据示例

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
from odps.tunnel import TableTunnel

table = o.get_table('my_table')

tunnel = TableTunnel(odps)
upload_session = tunnel.create_upload_session(table.name, partition_spec='pt=test')

with upload_session.open_record_writer(0) as writer:
    record = table.new_record()
    record[0] = 'test1'
    record[1] = 'id1'
    writer.write(record)

    record = table.new_record(['test2', 'id2'])
    writer.write(record)

# 需要在 with 代码块外 commit,否则数据未写入即 commit,会导致报错
upload_session.commit([0])

下载数据示例

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
from odps.tunnel import TableTunnel

tunnel = TableTunnel(odps)
download_session = tunnel.create_download_session('my_table', partition_spec='pt=test')
# 处理每条记录。
with download_session.open_record_reader(0, download_session.count) as reader:
    for record in reader:
        print(record)  # 具体的遍历步骤,这里是打印记录对象

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
【远程工具系列】节点小宝、RustDesk、向日葵、ToDesk、TeamViewer、AnyDesk ——六款主流远程控制软件横向测评对比
无论你是 DevOps 运维工程师、自由开发者,还是需要远程办公、远程剪辑乃至远程教学的普通用户,一款兼顾 “远程桌面 + 文件传输 + 内网穿透 + 异地组网” 的工具都能让效率几何级跃升。
猫头虎
2025/05/22
8330
【远程工具系列】节点小宝、RustDesk、向日葵、ToDesk、TeamViewer、AnyDesk ——六款主流远程控制软件横向测评对比
【软件】RustDesk自己搭建远程控制服务软件 支持控制手机
现在的远程控制软件真是越来越不好用了,todesk限制越来越多、向日葵有限速(我这时不时高延迟)、teamviewer限制了设备数等等等。所以如果能自己搭建一个远程控制,那连接速率就可以自主可控了,还安全。
小锋学长生活大爆炸
2022/11/12
5.9K0
【软件】RustDesk自己搭建远程控制服务软件 支持控制手机
Star 50.3k!超棒的国产远程桌面开源应用火了!
远程桌面软件不论是针对互联网行业的职场人,还是日常生活中有相关需求的人都是一大助力。也是必备的办公软件之一。不管是市面上流行的软件应用还是公司合作/自研的内网VPN,都在一点点的融入我们的工作和生活。
Python兴趣圈
2023/11/15
7.1K1
Star 50.3k!超棒的国产远程桌面开源应用火了!
再见了,Teamviewer!
大概今年年初的时候,在公司临时使用 Teamviewer 去远程控制家里的电脑,结果被别为商用。不得不再找替代品,比如向日葵、AnyDesk等等。
Python知识大全
2023/10/24
5690
再见了,Teamviewer!
再见了,Teamviewer!
大概今年年初的时候,在公司临时使用 Teamviewer 去远程控制家里的电脑,结果被别为商用。不得不再找替代品,比如向日葵、AnyDesk等等。
快学Python
2023/09/12
5780
再见了,Teamviewer!
[rustdesk]远程控制中继服务器
自从向日葵pc端限速后,远程越来越渣了,后来好像又恢复了,然后支持控制手机了,但是付费的,现需要一块软件控制各个设备 官网:http://rustdesk.com/zh/
一朵灼灼华
2022/08/05
6.6K0
[rustdesk]远程控制中继服务器
一文详解远程控制安全与远程控制软件(横测ToDesk\AnyDesk\向日葵)
远程控制的安全性已经算半个老生常谈的问题了,作为常年远程办公的人,这里我只想说一句,无论你用什么软件都会有安全上的隐患,做不到百分百的安全,但相对安全,咱们还是可以自主把控的。
海拥
2023/09/19
2.2K0
一文详解远程控制安全与远程控制软件(横测ToDesk\AnyDesk\向日葵)
再见付费的 TeamViewer,这款国产轻量级远程控制软件是绝佳的替代品!
前段时间,我们公司使用的向日葵远程控制竟然崩了,导致无法登录,当时以为是公司网络出问题了,结果并妹有。后来就看到官方回应说,因为大量用户涌入导致服务器宕机了!
沉默王二
2022/08/26
2.5K0
再见付费的 TeamViewer,这款国产轻量级远程控制软件是绝佳的替代品!
四款国内外远程桌面软件横测:ToDesk、向日葵、TeamViewer、AnyDesk
远程桌面软件对于职场人来说并不陌生,可以说是必备的办公软件之一。在经历过新冠疫情后,大家对于远程办公的认识越来越深入,也就在这段期间,远程桌面软件大范围的应用起来,真正走进大众视野并融入我们的工作和生活。
Python兴趣圈
2023/11/10
70.7K1
四款国内外远程桌面软件横测:ToDesk、向日葵、TeamViewer、AnyDesk
飞牛NAS docker compose环境下自建远程桌面服务:rustdesk
由于国内向日葵、todesk等应用的日渐模糊,恰巧我们已经实现了ipv6的内网穿透,而且在国内ipv6的延迟极低,加上本次介绍的开源远程桌面项目Rustdesk,简直是绝配。
季春二九
2024/10/30
3.7K0
飞牛NAS docker compose环境下自建远程桌面服务:rustdesk
实测:游戏情景中,远控软件实力如何?一篇告诉你ToDesk的强大之处
支持:Windows, macOS , iOS , Android , Linux (x86_x64/Arm_v7l/Arm64)且适配各种分辨率屏幕,多屏幕设备。
呆呆敲代码的小Y
2022/08/26
2.2K0
远控安全进阶之战:TeamViewer/ToDesk/向日葵设备安全策略对比
在数字化时代,一款卓越的远程控制软件需兼顾功能与体验:流畅连接确保指令实时响应,高清画质还原操作细节,低门槛UI设计降低使用难度,毫秒级延迟提升操作连贯性,多功能满足多样化需求。同时,优秀的远程控制软件还应具备独树一帜的远控安全技术,会通过前瞻性安全策略来阻挡各类网络风险和安全威胁,为用户打造全方位、可信赖的安全体验。在“远程密钥、身份认证、隐私屏”等一系列基础安全防护上做出更多创新,如 ToDesk 安全进阶的创新功能“二次验证保护”,可以称为是目前国内最安全远控的核心依据。
Francek Chen
2025/05/26
5010
远控安全进阶之战:TeamViewer/ToDesk/向日葵设备安全策略对比
疫情趋势下,远程控制软件成为刚需,ToDesk or 向日葵,哪一款最好用?
自 2020 年疫情爆发以来,为了避免员工外出感染的风险,很多企业被迫改变经营模式,从传统的办公室上班模式逐渐变为远程在家办公。既然是远程办公,当然离不开远程控制软件,这一年多时间我算是什么远程软件都见识过了,最离谱的 2021 年了居然还有人在用 QQ 远程桌面?比较常用的就是 TEAM、ToDesk 和向日葵,当然还有一些通过 VPN 来远程拨号连接的,下面我们来看看哪一款最好用?
Lucifer三思而后行
2022/04/13
2.3K0
疫情趋势下,远程控制软件成为刚需,ToDesk or 向日葵,哪一款最好用?
再见 Teamviewer,是时候拥抱下一代远程控制工具 RustDesk 了!
在 Windows 上一个 QQ 就能搞定的事,而 Mac 用户几乎只能依赖 Teamviewer。
iMike
2021/07/01
2.2K0
手机和PC远控安全深度测评:TeamViewer/ToDesk/向日葵安全防线对比
声明:本测试报告系作者基于个人兴趣及使用场景开展的非专业测评,测试过程中所涉及的方法、数据及结论均为个人观点,不代表任何官方立场或行业标准。
倔强的石头_
2025/06/19
1351
手机和PC远控安全深度测评:TeamViewer/ToDesk/向日葵安全防线对比
应急响应之远程软件日志分析
默认情况下todesk日志文件保存在安装目录同级目录Logs下,在4.7以前的版本中,目录下有以service为首的文件以及以client为首的文件。其中service文件表示是被别人远控的日志。client文件表示是远控别人的日志。在4.7后的版本含4.7中,目录下不再存在以client为首的文件。
FB客服
2023/08/08
2.7K0
应急响应之远程软件日志分析
春节来临:Windows & Mac 电脑设置自动开机、永不休眠、远程解决方案与远程办公指南
春节将至,对于许多人来说,这不仅是一段与家人团聚的美好时光,同时也可能是需要兼顾远程工作的关键时期。为了帮助大家在春节期间实现设备高效管理和远程办公,本文将从以下几个方面进行详细讲解:
猫头虎
2025/01/18
6540
春节来临:Windows & Mac 电脑设置自动开机、永不休眠、远程解决方案与远程办公指南
腾讯云锐驰型轻量服务器搭建开源远程桌面软件RustDesk中继服务器小记
由于我个人经常性出差,对远程桌面软件有强需求,而微软自带的RDP并不能完全满足我的需求,且国内的向日葵/ToDesk/TeamViewer的定价与吃相属实太过美丽,所以目光转向了开源的方案,最终敲定为RustDesk的原因是没有带宽分辨率限制(你也不想720P的远程分辨率吧),且拥有较为完善的第三方WebUI管理后台。
SakuraRain
2025/03/11
1.3K0
腾讯云锐驰型轻量服务器搭建开源远程桌面软件RustDesk中继服务器小记
跨平台rdp协议、类rdp协议、非rdp协议的远程软件
跨平台远程软件很多,何谓跨平台?支持windows、linux、macos、iOS、Android 等
Windows技术交流
2021/09/24
6.6K0
实测办公场景下,国产远程控制软件的表现力如何?(技术解析)
大家好,我是码农飞哥,作为一个常年混迹职场的老码农。我在工作和生活中碰到了很多问题,也帮助别人解决了很多问题。前有帮实习生配环境,后有帮同事调BUG,中间还有教老爸如何使用手机。
码农飞哥
2022/12/08
1K0
实测办公场景下,国产远程控制软件的表现力如何?(技术解析)
推荐阅读
【远程工具系列】节点小宝、RustDesk、向日葵、ToDesk、TeamViewer、AnyDesk ——六款主流远程控制软件横向测评对比
8330
【软件】RustDesk自己搭建远程控制服务软件 支持控制手机
5.9K0
Star 50.3k!超棒的国产远程桌面开源应用火了!
7.1K1
再见了,Teamviewer!
5690
再见了,Teamviewer!
5780
[rustdesk]远程控制中继服务器
6.6K0
一文详解远程控制安全与远程控制软件(横测ToDesk\AnyDesk\向日葵)
2.2K0
再见付费的 TeamViewer,这款国产轻量级远程控制软件是绝佳的替代品!
2.5K0
四款国内外远程桌面软件横测:ToDesk、向日葵、TeamViewer、AnyDesk
70.7K1
飞牛NAS docker compose环境下自建远程桌面服务:rustdesk
3.7K0
实测:游戏情景中,远控软件实力如何?一篇告诉你ToDesk的强大之处
2.2K0
远控安全进阶之战:TeamViewer/ToDesk/向日葵设备安全策略对比
5010
疫情趋势下,远程控制软件成为刚需,ToDesk or 向日葵,哪一款最好用?
2.3K0
再见 Teamviewer,是时候拥抱下一代远程控制工具 RustDesk 了!
2.2K0
手机和PC远控安全深度测评:TeamViewer/ToDesk/向日葵安全防线对比
1351
应急响应之远程软件日志分析
2.7K0
春节来临:Windows & Mac 电脑设置自动开机、永不休眠、远程解决方案与远程办公指南
6540
腾讯云锐驰型轻量服务器搭建开源远程桌面软件RustDesk中继服务器小记
1.3K0
跨平台rdp协议、类rdp协议、非rdp协议的远程软件
6.6K0
实测办公场景下,国产远程控制软件的表现力如何?(技术解析)
1K0
相关推荐
【远程工具系列】节点小宝、RustDesk、向日葵、ToDesk、TeamViewer、AnyDesk ——六款主流远程控制软件横向测评对比
更多 >
LV.1
腾讯云TDP会员
目录
  • 前言
  • PyODPS基础介绍
    • 运行环境
    • 示例场景
  • 通过DataWorks使用PyODPS
  • 表操作
    • 当前项目内的表操作
      • 列出项目空间下的所有表:
      • 判断表是否存在
      • 获取表
      • 跨项目的表操作
    • 创建表的Schema
    • 创建表
      • 使用表Schema创建表
      • 使用字段名及字段类型创建表
      • 使用字段名及字段类型创建表:新数据类型
    • 同步表更新
    • 写入表数据
      • 使用多进程并行写数据
    • 向表中插入一行记录
    • 获取表数据
    • 删除表
    • 表分区
      • 判断是否为分区表
      • 遍历表全部分区
      • 判断分区是否存在
      • 获取分区
      • 删除分区
    • 数据上传下载通道
      • 上传数据示例
      • 下载数据示例
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档