当前位置: 首页 > 知识库问答 >
问题:

从分区拼花文件读取DataFrame

宗项禹
2023-03-14

如何读取带有条件作为数据帧的分区镶木地板,

这工作得很好,

val dataframe = sqlContext.read.parquet("file:///home/msoproj/dev_data/dev_output/aln/partitions/data=jDD/year=2015/month=10/day=25/*")

分区存在的时间为< code>day=1到day=30是否可能读取类似于< code>(day = 5到6)或< code>day=5,day=6的内容,

val dataframe = sqlContext.read.parquet("file:///home/msoproj/dev_data/dev_output/aln/partitions/data=jDD/year=2015/month=10/day=??/*")

如果我输入< code>*,它会给出所有30天的数据,而且太大了。

共有3个答案

仇浩旷
2023-03-14

您需要提供 mergeSchema = true 选项。如下所述(这是从 1.6.0 开始的):

val dataframe = sqlContext.read.option("mergeSchema", "true").parquet("file:///your/path/data=jDD")

这将把所有的拼花文件读入dataframe,并在dataframe数据中创建年、月和日列。

参考: https://spark.apache.org/docs/1.6.0/sql-programming-guide.html#schema-merging

麹耘豪
2023-03-14

如果您想阅读多天,例如day=5andday=6并且想在路径本身中提及范围,可以使用通配符:

val dataframe = sqlContext
  .read
  .parquet("file:///your/path/data=jDD/year=2015/month=10/day={5,6}/*")

通配符还可用于指定天数范围:

val dataframe = sqlContext
  .read
  .parquet("file:///your/path/data=jDD/year=2015/month=10/day=[5-10]/*")

这与从5到10的所有日期匹配。

邹高峻
2023-03-14

< code > sqlcontext . read . parquet 可以将多条路径作为输入。如果您只想要< code>day=5和< code>day=6,您可以简单地添加两个路径,如下所示:

val dataframe = sqlContext
      .read.parquet("file:///your/path/data=jDD/year=2015/month=10/day=5/", 
                    "file:///your/path/data=jDD/year=2015/month=10/day=6/")

如果您在< code>day=X下有文件夹,例如< code>country=XX,< code>country将自动添加为< code>dataframe中的一列。

编辑:从Spark 1.6开始,需要提供“basepath”选项,以便Spark自动生成列。在Spark 1.6. x中,上述内容必须像这样重新编写,以创建包含“data”、“年”、“月”和“日”列的数据框:

val dataframe = sqlContext
     .read
     .option("basePath", "file:///your/path/")
     .parquet("file:///your/path/data=jDD/year=2015/month=10/day=5/", 
                    "file:///your/path/data=jDD/year=2015/month=10/day=6/")
 类似资料:
  • 我有一个拼花格式的大数据集(大小约1TB),分为2个层次:

  • 则错误如下: AttributeError:“property”对象没有属性“parquet”

  • 我们正在寻找一种解决方案,以便创建一个外部配置单元表,根据parquet/avro模式从parquet文件中读取数据。 换句话说,如何从拼花/avro模式生成hive表? 谢谢:)

  • 我需要从不是父目录或子目录的多个路径读取拼花地板文件。 例如, 从dir1\u 1和dir1\u 2读取拼花文件 现在,我正在读取每个目录并使用“unionAll”合并数据帧。有没有一种方法可以不使用unionAll从dir1\u 2和dir2\u 1读取拼花地板文件,或者有没有什么奇特的方法可以使用unionAll 谢谢

  • 我正在从Impala迁移到SparkSQL,使用以下代码读取一个表: 我如何调用上面的SparkSQL,这样它就可以返回这样的东西:

  • 我试图利用火花分区。我试图做这样的事情 这里的问题每个分区都会创建大量的镶木地板文件,如果我尝试从根目录读取,则会导致读取缓慢。 为了避免这种情况,我试过 但是,这将创建每个分区中镶木地板文件的数目。现在我的分区大小不同了。因此,理想情况下,我希望每个分区都有单独的合并。然而,这看起来并不容易。我需要访问所有分区合并到一定数量并存储在单独的位置。 我应该如何使用分区来避免写入后出现许多文件?