【问题标题】:The columns option in spark_read_parquetspark_read_parquet 中的 columns 选项
【发布时间】:2019-01-24 02:55:02
【问题描述】:

我尝试使用 spark_read_parquet 从“表”中读取列的子集,

temp <- spark_read_parquet(sc, name='mytable',columns=c("Col1","Col2"),
                                 path="/my/path/to/the/parquet/folder")

但我得到了错误:

Error: java.lang.IllegalArgumentException: requirement failed: The number of columns doesn't match.
Old column names (54): .....

我的语法对吗?我尝试使用 columns 参数在谷歌上搜索(真实)代码示例,但找不到。

(我提前道歉......我真的不知道如何给你一个涉及火花和云的可重复示例。)

【问题讨论】:

    标签: r apache-spark sparklyr


    【解决方案1】:

    TL;DR 这不是columns 的工作方式。当像这样应用时,are usedrename the columns,因此它的长度应该等于输入的长度。

    使用方法是(请注意memory = FALSE,这对它的正常工作至关重要):

    spark_read_parquet(
      sc, name = "mytable", path = "/tmp/foo", 
      memory = FALSE
    ) %>% select(Col1, Col2) 
    

    可选后跟

    ... %>% 
      sdf_persist()
    

    如果有字符向量,可以使用rlang

    library(rlang)
    
    cols <- c("Col1", "Col2")
    
    spark_read_parquet(sc, name="mytable", path="/tmp/foo", memory=FALSE) %>% 
      select(!!! lapply(cols, parse_quosure))
    

    【讨论】:

    • 太好了。那么,有没有办法在读取列子集时将其加载到内存中?
    • 这是您使用sdf_persist 的地方,或者如果您想将自己限制在内存中sdf_persist("MEMORY")。它是懒惰的,但否则会做同样的想法。但是请记住,不加选择的缓存可能会降低性能而不是提高性能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-18
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 2012-10-24
    相关资源
    最近更新 更多