Apache spark 在pyspark中,当使用df.write.partitionBy(..).save时,如何按特定列的部分值进行分区?

Apache spark 在pyspark中,当使用df.write.partitionBy(..).save时,如何按特定列的部分值进行分区?,apache-spark,pyspark,apache-spark-sql,Apache Spark,Pyspark,Apache Spark Sql,我想在我的Spark数据框中按日期而不是按时间划分,我该怎么做 假设我有第一列为datetime的dataframe,如“2019-06-25 12:00:00”、“2019-06-25 11:00:00”等。我知道如何按时间划分,但不知道如何按日期划分 spark=SparkSession.builder.getOrCreate() df=spark.sparkContext.parallelize([ 世界其他地区(“2019-06-25 12:00:00”,“2”),世界其他地区(“201

我想在我的Spark数据框中按日期而不是按时间划分,我该怎么做

假设我有第一列为datetime的dataframe,如“2019-06-25 12:00:00”、“2019-06-25 11:00:00”等。我知道如何按时间划分,但不知道如何按日期划分

spark=SparkSession.builder.getOrCreate()
df=spark.sparkContext.parallelize([
世界其他地区(“2019-06-25 12:00:00”,“2”),世界其他地区(“2019-06-25 11:00:00”,“a”),
世界其他地区(“2019-06-24 02:03:10”,“2”),世界其他地区(“2019-06-22 08:00:00”,“b”),
行(“2019-03-12 08:01:34”,“3”))。toDF([“日期时间”,“val”))
我想使用以下方法

df.write.partitionBy(substr('datetime', 10)).save(path='...', mode='...')

为了实现我的目标,但显然上述方法行不通。

在这种情况下,您只需根据“datetime”字段添加一个新列,比如“date\u only”

代码片段如下所示

< P> 1)从源SQL或任何平面文件系统登记您的数据文件。在这种情况下,我们考虑下面的顺序。< /P>
df = spark.sparkContext.parallelize([
    ("2019-06-25 12:00:00", "2"), ("2019-06-25 11:00:00", "a"),
    ("2019-06-24 02:03:10", "2"), ("2019-06-22 08:00:00", "b"),
    ("2019-03-12 08:01:34", "3")]).toDF(["datetime", "val"])
2) 从源数据帧准备一个新的数据帧这将允许您拥有一个新列,并且现有列不会从分区中的结果文件中消失

from pyspark.sql import functions as func
partitioned_df = df.withColumn("date_only", func.to_date(func.col("datetime")))
partitioned_df.write.partitionBy('date_only').save(path='dbfs:/FileStore/tables/Temp', mode='append')
3) 以追加模式将数据保存到这些分区中

from pyspark.sql import functions as func
partitioned_df = df.withColumn("date_only", func.to_date(func.col("datetime")))
partitioned_df.write.partitionBy('date_only').save(path='dbfs:/FileStore/tables/Temp', mode='append')
4) 我在Databricks中尝试了以下方法,分类法如下所示:

5) 此外,拼花地板(Snappy)文件包含如下结果:


请让我知道这是否解决了您的问题。

可能是重复的,所以答案是否@据我所知,用户10938362。一个不太优雅的解决方案是添加一个新列,其中包含
substr('datetime',10)
和该列上的分区。