sparklyr 我可以将格式和路径选项传递给 spark_write_table 吗?或将 saveAsTable 与 spark_write_orc 一起使用?

sparklyr can I pass format and path options into spark_write_table? or use saveAsTable with spark_write_orc?

带有 Hive 的 Spark 2.0

假设我正在尝试编写一个 spark 数据帧,irisDf 到 orc 并且 将它保存到 hive metastore

在 Spark 中我会这样做,

irisDf.write.format("orc")
    .mode("overwrite")
    .option("path", "s3://my_bucket/iris/")
    .saveAsTable("my_database.iris")

sparklyr中我可以使用spark_write_table函数,

data("iris")
iris_spark <- copy_to(sc, iris, name = "iris")
output <- spark_write_table(
   iris
  ,name = 'my_database.iris'
  ,mode = 'overwrite'
)

但这不允许我设置 pathformat

我也可以用spark_write_orc

spark_write_orc(
    iris
  , path = "s3://my_bucket/iris/"
  , mode = "overwrite"
)

但它没有 saveAsTable 选项

现在,我可以使用 invoke 语句来复制 Spark 代码,

  sdf <- spark_dataframe(iris_spark)
  writer <- invoke(sdf, "write")
  writer %>% 
    invoke('format', 'orc') %>% 
    invoke('mode', 'overwrite') %>% 
    invoke('option','path', "s3://my_bucket/iris/") %>% 
    invoke('saveAsTable',"my_database.iris")

但我想知道是否可以将 formatpath 选项传递给 spark_write_table 或将 saveAsTable 选项传递给 spark_write_orc

path可以使用options参数设置,相当于在原生DataFrameWriter:

中调用options
spark_write_table(
  iris_spark, name = 'my_database.iris', mode = 'overwrite', 
  options = list(path = "s3a://my_bucket/iris/")
)

默认情况下,在 Spark 中,这将创建一个 table,在 path 处存储为 Parquet(分区子目录可以使用 partition_by 参数指定)。

截至目前,还没有这样的格式选项,但一个简单的解决方法是在运行时设置 spark.sessionState.conf.defaultDataSourceName 属性

spark_session_config(
  sc, "spark.sessionState.conf.defaultDataSourceName", "orc"
)

或者在您创建会话时。

spark.sessionState.conf.defaultDataSourceName 是在 Spark 2.2 中引入的,可以找到源代码 here

在 Spark 2.1.1 中,设置此设置(在连接前的配置中或 运行 时间)对我有用:

spark_session_config(
  sc, "spark.sql.sources.default", "orc"
)