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
.