将列表项转换为已定义的数据类型RDD

时间:2016-12-26 21:37:51

标签: python apache-spark

实际上,我在cloudera的数据标签中使用Apache Spark Python的工作区。我们的想法是阅读csv并格式化每个字段。

所以,第一步是阅读csv:

uber = sc.textFile("dbfs:/mnt/uber/201601/pec2/uber_curated.csv")

下一步是将每一行转换为值列表:

uber_parsed = uber.map(lambda lin:lin.split(","))
print (uber_parsed.first())

结果是:

[u'B02765', u'2015-05-08 19:05:00', u'B02764', u'262', u'Manhattan',u'Yorkville East']

但是,现在我需要将下一个值列表的每个项目转换为下一个格式String,Date,String,Integer,String,String。

[[u'B02765', u'2015-05-08 19:05:00', u'B02764', u'262', u'Manhattan', u'Yorkville East'],
[u'B02767', u'2015-05-08 19:05:00', u'B02789', u'400', u'New York', u'Yorkville East']]

有人知道怎么做吗?

1 个答案:

答案 0 :(得分:1)

您可以使用csv读者。在Spark 1.x中,您需要一个外部依赖项(spark-csv)。

from pyspark.sql.types import *

sqlContext.read.format("csv").schema(StructType([
    StructField("_1", StringType()),
    StructField("_2", TimestampType()),
    StructField("_3", StringType()),
    StructField("_4", IntegerType()),
    StructField("_5", StringType()),
    StructField("_6", StringType()),
])).load("dbfs:/mnt/uber/201601/pec2/uber_curated.csv").rdd

sqlContext.read.format("csv").schema(StructType([
    StructField("_1", StringType()),
    StructField("_2", DateType()),
    StructField("_3", StringType()),
    StructField("_4", IntegerType()),
    StructField("_5", StringType()),
    StructField("_6", StringType()),
])).option("dateFormat", "yyyy-dd-MM HH:mm:ss").load(
    "dbfs:/mnt/uber/201601/pec2/uber_curated.csv"
).rdd

您可以使用描述性字段名称替换(_1_2 .. _n)。