Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 在Spark中阅读分割拼花地板_Apache Spark_Pyspark_Apache Spark Sql_Parquet - Fatal编程技术网

Apache spark 在Spark中阅读分割拼花地板

Apache spark 在Spark中阅读分割拼花地板,apache-spark,pyspark,apache-spark-sql,parquet,Apache Spark,Pyspark,Apache Spark Sql,Parquet,我有一个如下所示的阶段数据目录,我希望能够将2018年和2019年的数据读取到一个数据帧中,而无需单独读取和合并 据我所知,我应该能够给spark汽车的数据目录,并应用一个过滤器,哪一个spark会按下?当我尝试这样做时,它说模式无法推断,所以必须手动定义 注意:我需要在不将年份文件夹名称更改为year=2018的情况下执行此操作 如何为以下数据指定架构?我已经试着研究过了,但是找不到 如何将数据加载为spark.parquet'car_data'。过滤器'year>2019',以便按下过滤器,

我有一个如下所示的阶段数据目录,我希望能够将2018年和2019年的数据读取到一个数据帧中,而无需单独读取和合并

据我所知,我应该能够给spark汽车的数据目录,并应用一个过滤器,哪一个spark会按下?当我尝试这样做时,它说模式无法推断,所以必须手动定义

注意:我需要在不将年份文件夹名称更改为year=2018的情况下执行此操作

如何为以下数据指定架构?我已经试着研究过了,但是找不到 如何将数据加载为spark.parquet'car_data'。过滤器'year>2019',以便按下过滤器,只加载2019-20年的数据? 有人知道.mani文件的用途吗? 提前谢谢

car_data
 |---2018
    |---xxx.snappy.parquet
    |---xxx.snappy.parquet
    |---xxx.snappy.parquet.mani
 |---2019
    |---xxx.snappy.parquet
    |---xxx.snappy.parquet
    |---xxx.snappy.parquet.mani
 |---2020
    |---xxx.snappy.parquet
    |---xxx.snappy.parquet.mani
                

对于您的用例,应用谓词、向下推并加载相关数据并不是直接的。如前所述,您没有像year=2018这样的列,因此在这种情况下,您需要选择不同的方法

创建一个接受数组[2018、2019]的函数,它应该在谓词的帮助下构造一个路径,并最终返回一个路径集合。 Seq/car_data/2018/,/car_data/2019/

将集合传递给spark.read.parquetpaths:String*,它基本上加载给定路径的所有数据。因此,在本例中,您将在单个数据帧中获得2018年和2019年的数据

为了方便起见,可以将第二项作为可重用函数

更新帖子:


如果您想将年份作为相应数据集的列之一,那么迭代collectionyears->动态构建路径->加载数据->添加具有相应值的新列year,并最终合并结果。

在对Hive table进行了一些实验后,我意识到有一个解决方案适合您:您可以

因此,您要做的第一件事是创建一个包含所有模式的表,包括所有可能的分区,并在每个分区中添加一些虚拟数据以触发分区创建

创建一个按日期分割的字符串; 将“A”、“2020-01-01”插入测试值中; -注意这个分区的当前位置是 -`/apps/hive/warehouse/default.db/test/date\u part=2020-01-01` 现在您可以通过

更改表测试分区日期\u部分=2020-01-01 设置位置/apps/hive/warehouse/default.db/test/2020-01-01; 你们都准备好了

从日期为2020-01-01的测试中选择* - +--+-------+ -| a |日期| U部分| - +--+-------+ -| A | 2020-01-01| - +--+-------+
谢谢,问题是这个方法没有添加年份列,我想能够区分每一行的来源。你知道parquet.mani文件是什么吗?@Dee更新了帖子,我不知道parquet.mani文件我知道我可以做上述操作,你没有错,但我想避免加入工会,因为将有很多df/文件要提交给union。Spark说,如果文件夹名称不是year=2008,我必须手动指定模式,因此我需要知道如何在模式中指定2008或每个文件夹名称应放在一个year列中。我无法获得大量df文件,例如:2018->携带100个拼花地板,2019->携带120个拼花地板文件,您将2018年的数据作为一个单独的DF加载,将新的列年份设置为2018年,将2019年的数据作为一个单独的DF加载,将新的列年份设置为2019年,最后将两个DF合并为一个DF。结果,DF中的每个记录都有年份列。是否可以将路径从2020重命名为year=2020,或者制作替代副本?不,很遗憾,无法更改原始数据。另外,如果我可以更改名称,我也不会发布这个问题,我正在寻找替代方案,Spark说模式需要手动指定,但我看不到关于如何构造它的任何指导。不幸的是,无法更改原始数据,但如果我可以更改文件夹的命名,我也不会发布问题。我正在寻找一个替代方案,因为Spark说模式需要手动指定,但我看不到任何关于如何构造它的指导