私は FastAPI を使用して、ユーザーが次のことを行うためにリクエストできる API に取り組んでいます。
- まず、get リクエストが Google Cloud Storage からファイルを取得し、それを pyspark DataFrame に読み込みます。
- 次に、アプリケーションは DataFrame でいくつかの変換を実行します
- 最後に、DataFrame を寄木細工のファイルとしてユーザーのディスクに書き込みたいと思います。
いくつかの理由により、ファイルを寄木細工の形式でユーザーに配信する方法がよくわかりません。
df.write.parquet('out/path.parquet')
データをディレクトリに書き込みますが、データout/path.parquet
を渡そうとすると問題が発生しますstarlette.responses.FileResponse
- 存在することがわかっている単一の .parquet ファイルを渡すと
starlette.responses.FileResponse
、バイナリがコンソールに出力されているように見えます (以下のコードで示されているように)。 - pandas のようにDataFrame を BytesIO ストリームに書き込むことは有望に思えましたが、DataFrame のメソッドまたは DataFrame.rdd のメソッドを使用してそれを行う方法がわかりません。
これは FastAPI でも可能ですか? send_file()を使用してFlaskで可能ですか?
ここに私がこれまで持っているコードがあります。コメント付きのコードのようないくつかのことを試してみましたが、役に立たなかったことに注意してください。
import tempfile
from fastapi import APIRouter
from pyspark.context import SparkContext
from pyspark.sql.session import SparkSession
from starlette.responses import FileResponse
router = APIRouter()
sc = SparkContext('local')
spark = SparkSession(sc)
df: spark.createDataFrame = spark.read.parquet('gs://my-bucket/sample-data/my.parquet')
@router.get("/applications")
def applications():
df.write.parquet("temp.parquet", compression="snappy")
return FileResponse("part-some-compressed-file.snappy.parquet")
# with tempfile.TemporaryFile() as f:
# f.write(df.rdd.saveAsPickleFile("temp.parquet"))
# return FileResponse("test.parquet")
ありがとう!
編集:ここで提供されている回答と情報を使用してみましたが、うまく機能しません。