我想从s3的存储桶中获取一些csv文件。由于没有连接器,我需要通过查询才能达到s3。如何设置查询?
试图使用邮递员,并从邮递员的预览中复制信息,但无济于事。
现在,我需要将这些标头从逻辑上放入powerBI,但是,powerBi无法像邮递员那样进行转换。有解决方案吗?
答案 0 :(得分:0)
好吧,所以我终于在powerBI中使用python脚本成功了。
由于powerBI可以使用pyhton,因此实际上可以直接从s3导入文件或对象。我需要一个csv文件,并使用此代码来做到这一点:
import boto3
import pandas as pd
import io
bucket = 'name of your bucket'
key = 'name of your file'
s3 = boto3.client('s3')
f = s3.get_object(Bucket=bucket, Key=key)
shape = pd.read_csv(io.BytesIO(f['Body'].read()), header=0, index_col=0)
shape = shape.apply(lambda x: x.fillna(0))
print(shape)
这使我可以将对象转换为powerBI能够读取的熊猫数据框。 确保检查powerBI是否使用了正确的python环境,并安装了pnada和io,并且boto3带有通过awscli在aws中注册的凭证或在文件凭证中的凭证(该区域同样适用)。
答案 1 :(得分:0)
只要使用PowerBI查询的人的计算机上都具有AWS CLI,您接受的答案就很好。我的用例是将要使用此PowerBI模板的个人要登录并从该点开始进行身份验证。
通过PowerBI访问S3存储桶的另一种方法是按照this question on the Power BI forums使用AWS API Gateway和Lambda函数创建预签名URL。这是来自用户spinwards的相关答案:
- 创建一个新的Lambda函数...目前可以为空
- 在API网关中设置新的API
- 创建一个新的GET方法
- 3.1选择Lambda函数作为集成类型
- 3.2选择“使用Lambda代理集成”选项
- 3.3选择区域并输入您在步骤1中创建的lambda函数的名称
- 编辑您的lambda函数。
- 4.1使用AWS开发工具包,为文件生成带有预签名密钥的url
- 4.2从步骤4.1返回303重定向到网址
这是python 2.7中的lambda函数的示例:
table2_id
您可以使用此PowerBI查询作为起点:
bucket = 'bucket-name'
key = 'path-to-file'
client = boto3.client('s3')
link = client.generate_presigned_url(
'get_object',
{'Bucket': bucket, 'Key': key},
7200, 'GET')
return {
"statusCode": 303,
"headers": {'Location': link}
}
一旦所有事情都用一个文件处理,就可以参数化API和Lambda函数以接受s3路径,以便可以从S3帐户提取任何内容。
Spinwards还提供有关身份验证的以下警告:
在将其推广到生产环境之前,您应该考虑某种身份验证。常规的AWS IAM身份验证令牌无法与PowerBI完美配合,因此您将需要对API网关使用自定义身份验证方法:https://docs.aws.amazon.com/apigateway/latest/developerguide/use-custom-authorizer.html。我最终使用了基本身份验证,这不是世界上最强大的功能,但是API Gateway使用https,因此它应该足够安全。
因为PowerBI不自动支持v4签名身份验证,并且我的用户的计算机上可能没有CLI,所以我一直在尝试的另一种选择是在python查询中包含并重构python v4 signature examples from AWS documentation pages。这将允许在计算机上没有AWS CLI的情况下进行呼叫,但是要求用户输入其访问密钥和秘密访问密钥。据我所知,PowerBI中的参数不会自动暴露给python查询,因此我正在研究通过创建包含它们的数据集as per this stackoverflow question and answer.
来公开这些参数