我有一个包含大量数据(200Gb+)的三角洲湖,我需要使用可以在 Python 中运行 SQL 的东西来清除它。我不想直接清除 .parquet 文件,我想直接使用数据库。
我的问题是哪一个更适合这项任务?
我认为它是 PySpark,因为它具有分布式计算功能,而且人们使用 SQLalchemy 执行这样的大型查询也并不罕见。
PySpark 和 SQLAlchemy 并不是真正具有可比性的工具。
SQLAlchemy 只是一个 ORM,可用于混淆代码在应用程序中嵌入数据库操作。它所做的就是从各种方法调用中获取输入,并使用它来构建 SQL 查询,然后将其从数据库发送出去。数据库决定将用于实现查询所要求的任何内容的最佳物理访问计划。
PySpark 是 Spark 的 Python 接口,它(除其他外)是一个用于构建可在大型存储集群上高效运行的数据管道的框架。与 SQLAlchemy 不同,Spark 本身将决定查询计划是什么样子以及如何在集群的节点上编排它。
您应该使用哪个可能只是底层存储系统是什么样子的问题。它是一个多节点 Hadoop 集群,您的工作将受益于跨节点的并行执行吗?然后使用 Spark。或者,您的存储是单个 Postgres 数据库吗?然后使用 SQLAlchemy。
我确实认为您的问题结构不正确。假设您想要连接到外部数据库,使用 pyspark 工具连接或导入 SQLAlchemy 并使用它会更好吗?
这是根据具体情况而定的:
导入后您是否使用 pandas 来操作数据?然后使用 SQLAlchemy。 您是否使用 pyspark 工具以分布式方式进行操作?然后使用 pyspark 库。使用 pyspark.sql 的缺点是您需要使用 jdbc 驱动程序,因此它看起来像这样:
from pyspark.sql import SparkSession
spark = SparkSession \
.builder \
.appName("DatabaseConnection") \
.config("spark.jars", "/path/to/your/jdbc_driver.jar") \
.getOrCreate()
# assuming you are using mysql
db_url = "jdbc:mysql://your_database_hostname:3306/your_database_name"
db_properties = {
"user": "your_username",
"password": "your_password"
}
table_name= "your_table_name"
然后您可以阅读整个表格:
data_frame = spark.read.format("jdbc") \
.option("url", db_url) \
.option("dbtable", table_name) \
.options(**db_properties) \
.load()
或通过查询阅读:
query = f"(SELECT * FROM table_name) AS tmp"
data_frame = spark.read.format("jdbc") \
.option("url", db_url) \
.option("query", query) \
.options(**db_properties) \
.load()
希望这有帮助