Фильтр таблицы Spark Cassandra в Spark Rdd

#scala #apache-spark #cassandra #rdd #spark-cassandra-connector

#scala #apache-искра #кассандра #rdd #spark-cassandra-connector #apache-spark

Вопрос:

Мне нужно отфильтровать таблицу Cassandra в spark, после получения данных из таблицы через spark применить функцию фильтра к возвращенному rdd, мы не хотим использовать предложение where в cassandra api, которое может фильтровать, но для которого требуется пользовательский индекс sasi в столбце фильтра, из-за чего возникают проблемы с дисковыми нагрузками из-за многократного сканирования таблицы ss в cassandra. например:

 val ct = sc.cassandraTable("keyspace1", "table1")
val fltr = ct.filter(x=x.contains "zz")
  

поля table1 являются :

  • dirid uuid
  • текст имени файла
  • событие int
  • bigint метки времени события
  • fileid int
  • тип файла int

В основном нам нужно фильтровать данные на основе имени файла с произвольной строкой. поскольку возвращаемый rdd имеет тип com.datastax.spark.connector.rdd.CassandraTableScanRDD[com.datastax.spark.connector.CassandraRow] = CassandraTableScanRDD , а операции фильтрации ограничены только методами CassandraRow типа, которые являются здесь введите описание изображения

     val ct = sc.cassandraTable("keyspace1", "table1")
    scala> ct
    res140: com.datastax.spark.connector.rdd.CassandraTableScanRDD[com.datastax.spark.connector.CassandraRow] = CassandraTableScanRDD[171] at RDD at CassandraRDD.scala:19
  

когда я нажимаю tab после «x». в приведенной ниже функции фильтра, которая показывает приведенные ниже методы класса CassandraRow, введите код здесь

 scala> ct.filter(x=>x.
columnValues   getBooleanOption   getDateTime         getFloatOption   getLongOption    getString             getUUIDOption     length
contains       getByte            getDateTimeOption   getInet          getMap           getStringOption       getVarInt         metaData
copy           getByteOption      getDecimal          getInetOption    getRaw           getTupleValue         getVarIntOption   nameOf
dataAsString   getBytes           getDecimalOption    getInt           getRawCql        getTupleValueOption   hashCode          size
equals         getBytesOption     getDouble           getIntOption     getSet           getUDTValue           indexOf           toMap
get            getDate            getDoubleOption     getList          getShort         getUDTValueOption     isNullAt          toString
getBoolean     getDateOption      getFloat            getLong          getShortOption   getUUID               iterator
  

Ответ №1:

Вам нужно получить строковое поле из CassandraRow объекта, а затем выполнить фильтрацию по нему. Итак, этот код будет выглядеть следующим образом:

 val fltr = ct.filter(x => x.getString("filename").contains("zz"))
  

Комментарии:

1. Да, это то, что я пробовал — val fltr = ct.filter(x => x.getStringOption(«filename»).contains(«zz»)) и теперь он работает нормально. Также просто хочу подтвердить, ищет ли метод contains поиск по шаблону? если я хочу получить имя файла, имеющее такие значения, как «/d/newfile.txt » и так далее, моим условием поиска было бы «подобное имя файла» *.txt

2. .getString предоставляет вам стандартный String класс, так что вы можете использовать любые функции, такие как регулярные выражения и т.д.