Pyspark читает CSV, комбинирует столбец даты и времени и фильтрует его

1

У меня около 10 000 файлов csv, содержащих по 14 столбцов. Они содержат данные о финансовой организации, торговых значениях, дате и времени.

Некоторые из файлов csv являются только заголовками и не содержат данных. Мне удалось загрузить все файлы csv в локальной файловой системе hasoop. То, что я хочу достичь, - это отфильтровать данные, чтобы включить записи, происходящие только между 9 утра и 6 вечера.

Как я могу это достичь? Im настолько запутано с лямбдой и фильтром, и все вещи существуют в искро-питоне.

Не могли бы вы показать мне, как я могу отфильтровать это и использовать отфильтрованные данные для других анализов?

PS, зимнее время и летнее время также нужно учитывать, что я думал, что у меня должны быть некоторые функции, чтобы изменить время на формат UTC?

Поскольку я беспокоюсь о фильтрации данных на основе столбца Time в моем файле csv, я упростил csvs. скажем:

CSV 1: (Filter.csv)

  • ISIN, валюта, дата, время
  • "1", "EUR", 2018-05-08,07: 00
  • "2", "EUR", 2018-05-08,17: 00
  • "3", "EUR", 2018-05-08,06: 59
  • "4", "EUR", 2018-05-08,17: 01

CSV 2: (NoFilter.csv)

  • ISIN, валюта, дата, время
  • "1", "EUR", 2018-05-08,07: 01
  • "2", "EUR", 2018-05-08,16: 59
  • "3", "EUR", 2018-05-08,10: 59
  • "4", "EUR", 2018-05-08,15: 01

и мой код:

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, так как нет подходящего времени.

Спасибо!

  • 0
    почтовый код, который вы пробовали, тогда мы можем помочь вам лучше
  • 0
    Это сделано, и я отредактировал мой вопрос.
Теги:
csv
apache-spark
filter
pyspark

2 ответа

1
Лучший ответ

В вашем коде вы можете использовать только "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()
  • 0
    Благодарю. Мне просто нужно было изменить: result = data.map (лямбда-строка: row.Time> '07: 00 'и row.Time <'17: 00') на result = df.filter (лямбда-строка: row.Time> ' 07:00 'и row.Time <'17: 00')
0

Хорошо, я узнал, в чем проблема с моим кодом! Я должен был использовать:

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 = и отфильтрован Отсутствует!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню