Sparklyr: список содержимого каталога в R с использованием методов invoke - PullRequest
0 голосов
/ 22 октября 2018

Невозможно найти встроенный sparklyr для отображения содержимого каталога через Spark. Я пытаюсь использовать invoke:

sc <- spark_connect(master = "yarn", config=config)
path <- 'gs:// ***path to bucket on google cloud*** '
spath <- sparklyr::invoke_new(sc, 'org.apache.hadoop.fs.Path', path) 
fs <- sparklyr::invoke(spath, 'getFileSystem')
list <- sparklyr:: invoke(fs, 'listLocatedStatus') 
Error: java.lang.Exception: No matched method found for class org.apache.hadoop.fs.Path.getFileSystem
    at sparklyr.Invoke.invoke(invoke.scala:134)
    at sparklyr.StreamHandler.handleMethodCall(stream.scala:123)
    at sparklyr.StreamHandler.read(stream.scala:66) ...

Примечание. Существуют ли рекомендации для воспроизводимых примеров сраспределенный код?Я не знаю, как привести пример, которому могли бы следовать другие, учитывая, что я работаю с определенной средой Spark.

1 Ответ

0 голосов
/ 22 октября 2018

getFileSystem метод принимает org.apache.hadoop.conf.Configuration объект в качестве первого аргумента:

public FileSystem getFileSystem(Configuration conf)
                     throws IOException

Возвращает файловую систему, которой принадлежит этот путь.

Параметры :

conf - конфигурация, используемая при разрешении файловой системы

Поэтому код для извлечения экземпляра FileSystem должен выглядеть примерно так или иначе:

# Retrieve Spark's Hadoop configuration
hconf <- sc %>% spark_context() %>% invoke("hadoopConfiguration")
fs <- sparklyr::invoke(spath, 'getFileSystem', hconf)

Дополнительно listLocatedStatus занимает либо Path

public org.apache.hadoop.fs.RemoteIterator<LocatedFileStatus> listLocatedStatus(Path f)
                                                                     throws FileNotFoundException,
                                                                            IOException

или Path и PathFilter (обратите внимание, что эта реализация protected):

public org.apache.hadoop.fs.RemoteIterator<LocatedFileStatus> listLocatedStatus(Path f)
                                                                    throws FileNotFoundException,
                                                                            IOException

Так что если вы хотите структурировать свой код, как показано выше, вам нужно будет предоставить по крайней мерепуть

sparklyr:: invoke(fs, "listLocatedStatus", spath)

На практике может быть проще просто получить FileSystem напрямую:

fs <- invoke_static(sc, "org.apache.hadoop.fs.FileSystem", "get",  hconf)

и использовать globStatus

lls <- invoke(fs, "globStatus", spath)

где spath - это путь с подстановочными знаками, например:

sparklyr::invoke_new(sc, 'org.apache.hadoop.fs.Path', "/some/path/*")

Результатом будет R list, который можно легко повторить:

lls  %>%
    purrr::map(function(x) invoke(x, "getPath") %>% invoke("toString"))

Кредиты :

Ответ на HМожно ли перечислить все файлы CSV в папке HDFS в оболочке Spark Scala? от @ jaime

Примечания :

  • В общем случае, если вы взаимодействуете с нетривиальным Java API, имеет гораздо больше смысла писать свой код на Java или Scala и предоставлять минимальный интерфейс R.
  • Для взаимодействий с конкретным файловым объектом храните егоможет быть проще использовать выделенный пакет.Для Google Cloud Storage вы можете взглянуть на googleCloudStorageR.
...