我正试图将一个巨大的csv文件读取到spark中,并将其加载到雪花表中。要读取csv文件,我们在pyspark中有以下语法:
file_df = spark.read.format('csv').option('header', 'true').option('inferSchema', 'true').load('/tmp/dirpath/data/')
我的csv文件的架构:
schema = StructType([
StructField("CUSTKEY", IntegerType(), True),
StructField("NAME", StringType(), True),
StructField("ADDRESS", StringType(), True),
StructField("NATIONID", IntegerType(), True),
StructField("PHONE", StringType(), True),
StructField("ACCTBAL", DoubleType(), True),
StructField("COMMENT", StringType(), True),
])
要从RDBMS表中读取数据,我们有以下语法:
yearDF = spark.read.format("jdbc").option("url", connectionUrl)
.option("dbtable", s"(${execQuery}) as year2016")
.option("user", devUserName)
.option("password", devPassword)
.option("partitionColumn","epochVals")
.option("lowerBound", minEp)
.option("upperBound", maxEp)
.option("numPartitions",15)
.load()
为了在从表读取时对数据进行分区,我们有选项partitionColumn
,在这里我们可以指定分区列(这是一个旧的场景&我的数据属于配置单元表的单个分区(,其中列epochVals
具有几乎唯一的值,参数numPartitions
有助于将数据划分为精确数量的分区(15是用于解释场景的随机数(,spark有15个分区来排列数据。
现在我的csv文件大小为35GB。我们总是可以根据代码中的要求repartition
一个数据帧,但spark中是否有在读取csv文件时对数据进行分区的选项?如果我已经知道CSV文件的模式和包含唯一值的列custkey
,我可以使用spark.read.format('CSV'(语句中的partitionColumn
和numpartitions
参数吗?如果不是,我如何在加载csv文件后确定repartition
数据的最佳分区数?有人能告诉我是否有可能按照我上面的要求去做吗?
回答问题的标题:不,如果使用spark.read,则没有。您需要在数据帧之后repartition
。