Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.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
Scala 有没有办法将拼花地板分区下的所有文件读取到单个spark分区上?_Scala_Apache Spark_Partitioning_Parquet - Fatal编程技术网

Scala 有没有办法将拼花地板分区下的所有文件读取到单个spark分区上?

Scala 有没有办法将拼花地板分区下的所有文件读取到单个spark分区上?,scala,apache-spark,partitioning,parquet,Scala,Apache Spark,Partitioning,Parquet,数据以拼花格式存储。拼花地板文件根据分区键列(用户id列的哈希值)进行分区 根据分区方案,我们知道: 给定用户的所有数据都属于同一分区 一个分区可以有1个以上的用户数据 在读取数据时,我希望1个用户的所有数据都落在同一个spark分区中。单个spark分区可以有多个用户,但它应该拥有所有这些用户的所有行 目前,我使用的是: SparkSession.read.parquet(“../userData”).repartition(200,col(“UserId”)) (还使用自定义分区器尝试了分区

数据以拼花格式存储。拼花地板文件根据分区键列(用户id列的哈希值)进行分区

根据分区方案,我们知道:

  • 给定用户的所有数据都属于同一分区
  • 一个分区可以有1个以上的用户数据
  • 在读取数据时,我希望1个用户的所有数据都落在同一个spark分区中。单个spark分区可以有多个用户,但它应该拥有所有这些用户的所有行

    目前,我使用的是: SparkSession.read.parquet(“../userData”).repartition(200,col(“UserId”))

    (还使用自定义分区器尝试了分区方式;操作顺序:DataFrame->RDD->KeyedRDD->partitionBy->RDD->DataFrame;在分区方式之前,有一个反序列化到对象的步骤,该步骤会分解无序写入)


    有没有办法避免重新分区并利用输入文件夹结构将用户的数据放在单个分区上?

    SparkSession.read.parquet
    应根据文件路径自动推断分区信息。你可以找到更多信息

    如果文件路径为:

    userData/
        UserId=1/
            part-00044-cf737804-90ea-4c37-94f8-9aa016f6953a.c000.snappy.parquet
            part-00044-cf737804-90ea-4c37-94f8-9aa016f6953b.c000.snappy.parquet
        UserId=2/
            part-00059-cf737804-90ea-4c37-94f8-9aa016f6953a.c000.snappy.parquet
        UserId=3/
            part-00002-cf737804-90ea-4c37-94f8-9aa016f6953a.c000.snappy.parquet
    

    调用
    SparkSession.read.parquet(“/path/to/userData”)
    时,它将按
    UserId进行分区

    您想做什么?您的问题似乎是“我可以通过让spark重新划分数据来避免重新划分吗”。。。?在读取数据时无法实现所需的功能。如果您希望在读取数据时以某种方式对数据进行分区,则必须在磁盘上以这种方式对数据进行分区。分区是否可以包含每个用户超过1行?当我将拼花读入数据帧时,
    df.rdd.getNumPartitions
    返回4(物理***.parquet的数量)而不是3(用户数量)这就是我希望实现的,这是因为你的机器上有3个以上的内核,每行可以由一个单独的内核处理。如果您的计算机上有3个内核,那么使用分区发现,两个文件的
    UserId=1
    内容将放在同一个分区中。
    userData/
        UserId=1/
            part-00044-cf737804-90ea-4c37-94f8-9aa016f6953a.c000.snappy.parquet
            part-00044-cf737804-90ea-4c37-94f8-9aa016f6953b.c000.snappy.parquet
        UserId=2/
            part-00059-cf737804-90ea-4c37-94f8-9aa016f6953a.c000.snappy.parquet
        UserId=3/
            part-00002-cf737804-90ea-4c37-94f8-9aa016f6953a.c000.snappy.parquet