我有一个带有日期列的数据框架。我已将其解析为年、月、日列。我想对这些列进行分区,但我不希望这些列保留在拼花文件中。
下面是我对数据进行分区和写入的方法:
df = df.withColumn('year', f.year(f.col('date_col'))).withColumn('month',f.month(f.col('date_col'))).withColumn('day',f.dayofmonth(f.col('date_col')))
df.write.partitionBy('year','month', 'day').parquet('/mnt/test/test.parquet')
这将正确创建拼花文件,包括嵌套的文件夹结构。但是,我不希望在拼花文件中包含年、月或日列。
如果使用df。写分区依据(“年”、“月”、“日”)。
这些列实际上并不存储在文件数据中。它们只是通过创建的文件夹结构进行渲染。
例如,<代码>分区('年')。csv(“/数据”)将创建如下内容:
/data/year=2018/part1---.csv
/data/year=2019/part1---.csv
当您读回数据时,它使用特殊路径年=xxx
来填充这些列。
您可以通过直接读取单个分区的数据来证明这一点。
例如,在这种情况下,<代码>年份将不会是一列。
df = spark.read.csv("data/year=2019/")
df.printSchema()
还有@Shu的回答可以用来调查。
您可以安全睡眠,确保这些列不会占用存储空间。
如果您真的不想简单地查看列,您可以在此表顶部放置一个排除这些列的视图。
Spark/Hive不会在拼花文件
中写入年、月、日
列,因为它们已经在分区By子句中。
例子:
val df=Seq((1,"a"),(2,"b")).toDF("id","name")
df.coalesce(1).write.partitionBy("id").csv("/user/shu/temporary2") //write csv file.
正在检查csv文件的内容:
hadoop fs -cat /user/shu/temporary2/id=1/part-00000-dc55f08e-9143-4b60-a94e-e28b1d7d9285.c000.csv
输出:
a
正如您所看到的,csv文件中没有包含id值
,就像您编写拼花文件
分区列不包含在part-*中一样。拼花文件。
要检查拼花地板文件的架构,请执行以下操作:
parquet-tools schema <hdfs://nn:8020/parquet_file>
您还可以验证拼花文件中包含的所有列。
则错误如下: AttributeError:“property”对象没有属性“parquet”
我很难找到这个问题的答案。假设我为拼花地板编写了一个数据框,并且我使用与相结合来获得一个分区良好的拼花地板文件。请参阅下面: 现在,稍后我想读取拼花文件,所以我这样做: 数据帧是否由分区?换句话说,如果拼花地板文件被分区,火花在将其读入火花数据帧时是否会维护该分区。还是随机分区? 同样,这个答案的“为什么”和“为什么不”也会有所帮助。
如何读取带有条件作为数据帧的分区镶木地板, 这工作得很好, 分区存在的时间为< code>day=1到day=30是否可能读取类似于< code>(day = 5到6)或< code>day=5,day=6的内容, 如果我输入< code>*,它会给出所有30天的数据,而且太大了。
我有一个具有如下模式的dataframe:
我试图利用火花分区。我试图做这样的事情 这里的问题每个分区都会创建大量的镶木地板文件,如果我尝试从根目录读取,则会导致读取缓慢。 为了避免这种情况,我试过 但是,这将创建每个分区中镶木地板文件的数目。现在我的分区大小不同了。因此,理想情况下,我希望每个分区都有单独的合并。然而,这看起来并不容易。我需要访问所有分区合并到一定数量并存储在单独的位置。 我应该如何使用分区来避免写入后出现许多文件?
Spark版本:2.3 hadoop dist:azure Hdinsight 2.6.5平台:azure存储:BLOB 集群中的节点:6个执行器实例:每个执行器6个内核:每个执行器3个内存:8gb 试图通过同一存储帐户上的spark数据框将azure blob(wasb)中的csv文件(大小4.5g-280列,2.8 mil行)加载到拼花格式。我重新划分了大小不同的文件,即20、40、60、10