PyODPS主要支持兩種資源類型,即文件和表。本文為您介紹PyODPS中資源的常見操作。

基本操作

  • list_resources():列出該項目空間下的所有資源。
  • exist_resource():判斷資源是否存在。
  • delete_resource():刪除資源。也可以通過Resource對象調(diào)用drop方法實現(xiàn)。
  • create_resource():創(chuàng)建資源。
  • open_resource():讀取資源。

文件資源

文件資源包括基礎(chǔ)的File類型,以及PyJarArchive類型。

  • 創(chuàng)建文件資源

    創(chuàng)建文件資源可以通過給定資源名、文件類型和一個file-like的對象(或字符串對象)調(diào)用create_resource()來創(chuàng)建。

    # 使用file-like的對象創(chuàng)建文件資源,注意壓縮包等文件需要用二進制模式讀取
    resource = o.create_resource('test_file_resource', 'file', file_obj=open('/to/path/file', 'rb'))
    # 使用字符串創(chuàng)建文件資源
    resource = o.create_resource('test_py_resource', 'py', file_obj='import this')
  • 讀取和修改文件資源
    打開一個資源有如下兩種方法:
    • 對文件資源調(diào)用open方法。
    • 在ODPS入口調(diào)用open_resource()方法。
    打開后的對象是file-like的對象。 類似于Python內(nèi)置的open()方法,文件資源也支持打開的模式,示例如下。
    with resource.open('r') as fp:  # 以讀模式打開資源。
        content = fp.read()  # 讀取全部的內(nèi)容。
        fp.seek(0)  # 回到資源開頭。
        lines = fp.readlines()  # 讀成多行。
        fp.write('Hello World')  # 報錯,讀模式下無法寫資源。
    
    with o.open_resource('test_file_resource', mode='r+') as fp:  # 讀寫模式打開資源。
        fp.read()
        fp.tell()  # 定位當前位置。
        fp.seek(10)
        fp.truncate()  # 截斷后面的內(nèi)容。
        fp.writelines(['Hello\n', 'World\n'])  # 寫入多行。
        fp.write('Hello World')
        fp.flush()  # 手動調(diào)用會將更新提交到ODPS。

    所有支持的打開類型包括:

    • r:讀模式,只能打開不能寫。
    • w:寫模式,只能寫入而不能讀文件,注意用寫模式打開,文件內(nèi)容會先被清空。
    • a:追加模式,只能寫入內(nèi)容到文件末尾。
    • r+:讀寫模式,可以任意讀寫內(nèi)容。
    • w+:類似于r+,但會先清空文件內(nèi)容。
    • a+:類似于r+,但寫入時只能寫入文件末尾。
    同時,PyODPS中文件資源支持以二進制模式打開,例如一些壓縮文件需要以這種模式打開。
    • rb:指以二進制讀模式打開文件。
    • r+b:指以二進制讀寫模式打開。

表資源

  • 創(chuàng)建表資源
    o.create_resource('test_table_resource', 'table', table_name='my_table', partition='pt=test')
  • 更新表資源
    table_resource = o.get_resource('test_table_resource')
    table_resource.update(partition='pt=test2', project_name='my_project2')
  • 獲取表及分區(qū)
    table_resource = o.get_resource('test_table_resource')
    table = table_resource.table
    print(table.name)
    partition = table_resource.partition
    print(partition.spec)
  • 讀寫內(nèi)容
    table_resource = o.get_resource('test_table_resource')
    with table_resource.open_writer() as writer:
        writer.write([0, 'aaaa'])
        writer.write([1, 'bbbbb'])
    
    with table_resource.open_reader() as reader:
        for rec in reader:
            print(rec)