Pyspark读取csv并合并日期和时间列并根据其进行过滤

时间:2018-08-31 07:59:43

标签: python csv apache-spark filter pyspark

我有大约10,000个csv文件,每个文件包含14列。它们包含有关金融组织,贸易价值,日期及其时间的数据。

某些csv文件只是标题,而其中没有数据。我设法将所有的csv文件加载到本地hadoop文件系统上。我要实现的是对数据进行过滤以包括仅在上午9点至下午6点之间发生的记录。

我将如何实现?我对lambda和filter非常困惑,所有东西都存在于spark-python中。

您能告诉我如何过滤此数据并使用过滤后的数据进行其他分析吗?

P.S,我还想考虑冬天和夏天的时间,我想我应该有一些功能可以将时间更改为UTC格式?

由于我担心要根据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,因为没有匹配时间。

谢谢!

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分:0)

确定我的代码出了什么问题!我应该用过:

{"points": 90, "block": 15}

filteredResultExpected = filteredResult 丢失了!