У меня около 10 000 файлов csv, содержащих по 14 столбцов. Они содержат данные о финансовой организации, торговых значениях, дате и времени.
Некоторые из файлов csv являются только заголовками и не содержат данных. Мне удалось загрузить все файлы csv в локальной файловой системе hasoop. То, что я хочу достичь, - это отфильтровать данные, чтобы включить записи, происходящие только между 9 утра и 6 вечера.
Как я могу это достичь? Im настолько запутано с лямбдой и фильтром, и все вещи существуют в искро-питоне.
Не могли бы вы показать мне, как я могу отфильтровать это и использовать отфильтрованные данные для других анализов?
PS, зимнее время и летнее время также нужно учитывать, что я думал, что у меня должны быть некоторые функции, чтобы изменить время на формат UTC?
Поскольку я беспокоюсь о фильтрации данных на основе столбца Time в моем файле csv, я упростил csvs. скажем:
CSV 1: (Filter.csv)
CSV 2: (NoFilter.csv)
и мой код:
from pyspark import SparkContext, SparkConf
from pyspark.sql import SQLContext
sqlc = SQLContext(sc)
ehsanLocationFiltered = 'hdfs://localhost:54310/user/oxclo/ehsanDbs/Filter.csv'
ehsanLocationNonFiltered = 'hdfs://localhost:54310/user/oxclo/ehsanDbs/NoFilter.csv'
df = sqlContext.read.format('com.databricks.spark.csv')\
.options(header='true', inferschema='true')\
.load(ehsanLocationNonFiltered)
dfFilter = sqlContext.read.format('com.databricks.spark.csv')\
.options(header='true', inferschema='true')\
.load(ehsanLocationFiltered)
data = df.rdd
dataFilter = dfFilter.rdd
data.filter(lambda row: row.Time > '07:00' and row.Time < '17:00')
dataFilter.filter(lambda row: row.Time > '07:00' and row.Time < '17:00')
print data.count()
print dataFilter.count()
Я ожидаю, что data.count вернет 4, поскольку все времена подходят для диапазона, а dataFilter.count возвращает 0, так как нет подходящего времени.
Спасибо!
В вашем коде вы можете использовать только "csv" в качестве формата
from pyspark import SparkContext, SparkConf
ehsanLocationFiltered = '/FileStore/tables/stackoverflow.csv'
df = sqlContext.read.format('csv')\
.options(header='true', inferschema='true')\
.load(ehsanLocationFiltered).rdd
result=data.map(lambda row: row.Time > '07:00' and row.Time < '17:00')
result.count()
Хорошо, я узнал, в чем проблема с моим кодом! Я должен был использовать:
from pyspark import SparkContext, SparkConf
from pyspark.sql import SQLContext
sqlc = SQLContext(sc)
ehsanLocationFiltered = 'hdfs://localhost:54310/user/oxclo/ehsanDbs/Filter.csv'
ehsanLocationNonFiltered = 'hdfs://localhost:54310/user/oxclo/ehsanDbs/NoFilter.csv'
df = sqlContext.read.format('com.databricks.spark.csv')\
.options(header='true', inferschema='true')\
.load(ehsanLocationNonFiltered)
dfFilter = sqlContext.read.format('com.databricks.spark.csv')\
.options(header='true', inferschema='true')\
.load(ehsanLocationFiltered)
data = df.rdd
dataFilter = dfFilter.rdd
filteredResult = data.filter(lambda row: row.Time > '07:00' and row.Time < '17:00')
filteredResultExpected =dataFilter.filter(lambda row: row.Time > '07:00' and row.Time < '17:00')
print filteredResult.count()
print filteredResultExpected.count()
filterResultExpected = и отфильтрован Отсутствует!