【问题标题】:Pandasql table not found error on AWS Lambda Function which works on local machine在本地机器上工作的 AWS Lambda 函数上找不到 Pandasql 表错误
【发布时间】:2019-08-26 13:14:52
【问题描述】:

我正在从 AWS S3 读取 pandas DF,尝试在其上运行一些预处理 SQL 并再次保存为 csv,同样使用 pandasql 库。这里的挑战是,在我的本地机器上它工作得很好,但在 AWS Lambda 上它失败并出现以下错误:

"An error occured: (sqlite3.OperationalError) no such table: TblV\n[SQL: SELECT * from  TblV;]\n(Background on this error at: http://sqlalche.me/e/e3q8)"

注意:我在 Amazon AMI Linux EC2 实例上构建了 pandas 和 pandasql 的部署包,使用 lambda_function 代码对其进行压缩并推送到 AWS S3 并通过传递路径。

我的本​​地代码,运行良好:

import pandas as pd
from pandasql import sqldf
from time import time

t1 = time()

TblV = pd.read_csv(r"C:\Users\ab\Documents\test.csv")
query = """SELECT * from TblV"""

df = sqldf(query, globals())
print(df.columns)
print(df.shape)
print(df.head(5))

t2 = time()
print('Time taken: ', t2 - t1)

我在 AWS Lambda 函数中的代码无论我做什么都会引发上述错误:

import json
import boto3
import datetime
import pandas as pd
from pandasql import sqldf
import sys
from io import StringIO


def lambda_handler(event, context):
    try:
        client = boto3.client('s3')
        bucket_name = 'bucket'

        object_key = 'test/Vol/test.csv'
        csv_obj = client.get_object(Bucket=bucket_name, Key=object_key)
        body = csv_obj['Body']
        csv_string = body.read().decode('utf-8')

        TblV = pd.read_csv(StringIO(csv_string))
        print(TblV.head(5)) # This print works perfectly
        query = """SELECT * from  TblV;"""

        df = sqldf(query, globals())
        print(df.columns)
        print(df.shape)
        print(df.head(5))
    except Exception as e:
        err = "An error occured: " + str(e)
        return err

【问题讨论】:

    标签: pandas amazon-web-services aws-lambda python-3.6 pandasql


    【解决方案1】:

    您需要下载 tmp 文件夹中的查找。 AWS lambda 具有 500MB 的临时存储空间。

    client.download_file(bucket_name, object_key,'/tmp/file_name.extension')

    为了读取数据

    TblV = pd.read_csv(r"/tmp/file_name.extension") query = """SELECT * from TblV"""

    【讨论】:

    • 即使我知道您提供的解决方案,但我的问题是为什么它会以直接方式失败(我已经这样做了)?两者都是相同的类型,即 pandas DF。不是吗?
    【解决方案2】:

    尝试使用“df = sqldf(query, locals())”而不是“df = sqldf(query, globals())”。 变量“TblV”是在函数内部定义的,因此它不能被称为全局变量。

    【讨论】:

      猜你喜欢
      • 2023-03-12
      • 1970-01-01
      • 2020-12-28
      • 2019-04-20
      • 2017-06-05
      • 2021-11-20
      • 2023-03-12
      • 1970-01-01
      • 2017-04-16
      相关资源
      最近更新 更多