如何创建动态数据框
Posted
技术标签:
【中文标题】如何创建动态数据框【英文标题】:How to create a dynamic dataframe 【发布时间】:2020-02-08 15:36:06 【问题描述】:我试图创建一个数据框,我以以下方式创建数据框的原因是为了使其动态,但表达式作为字符串传递并且 exec 命令无法创建数据框架并分配给一个变量。
这是我的代码:
def fileReader(inputFileType,sourceFilePath,inputFileType):
value ='true'
header='header'
a= "spark.read.option('"+header+"','"+value+"')."+inputFileType+"('"+sourceFilePath+"')"
print(a)
print(type(a))
ds = exec(a)
return 'True'
【问题讨论】:
请澄清问题,并分享minimal reproducible example。此外,变量和函数名称应遵循lower_case_with_underscores
样式。
【参考方案1】:
你可以试试下面的配置文件
import json
files = json.loads('
"fileA":
"header": "true",
"inputFileType": "csv",
"sourceFilePath": "path_to_fileA"
,
"fileB":
"header": "true",
"inputFileType": "parquet",
"sourceFilePath": "path_to_fileB"
')
df_dict =
for file in files:
df_dict['file'] = spark.read.option('header',file["header"]).format(file["inputFileType"]).path(file["sourceFilePath"])
然后你会得到一个包含不同格式和文件路径的数据帧字典。
【讨论】:
【参考方案2】:嘿,你知道答案了……
def fileReader(inputFileType,sourceFilePath,inputFileType):
value ='true'
header='header'
a= "spark.read.option('"+header+"','"+value+"')."+inputFileType+"
('"+sourceFilePath+"')"
print(a)
print(type(a))
ds = eval(a)
return 'True'
创建此函数的动机是使用 pyspark 支持的不同文件格式动态创建数据帧。 现在使用这个函数,我可以创建一个 pyspark 支持的任何类型的文件格式的数据框,只需传递文件的位置和格式。
感谢所有帮助。
【讨论】:
【参考方案3】:我建议在代表 spark 命令的字符串上使用 pyspark 而不是 exec
。 pyspark 有一个非常好的接口,用于在 python 中执行 spark 命令。它还有一个方便的函数csv
在pyspark.sql
模块上loads data from a csv file into a spark dataframe。您的代码将如下所示:
from pyspark.sql import SparkSession
spark =(SparkSession.builder
.appName(YOUR_APP_NAME)
.getOrCreate())
csv_df = spark.csv('path/to/csv')
但是,如果您的数据存储在 csv 中,我怀疑没有足够的数据来真正保证使用 spark,这会产生很多开销并且用于处理非常大的数据集。我建议先试用 pandas,which also has a handy way of loading csv data into a dataframe,并且只有在你的代码在 pandas 上运行太慢时才切换到 spark。
【讨论】:
嗨,查理,它不仅适用于 csv,也适用于其他格式,如镶木地板等。 我使用exec的原因是我想动态传递文件格式,而不是只对一种格式保持静态。以上是关于如何创建动态数据框的主要内容,如果未能解决你的问题,请参考以下文章