在将RDD转换为DataFrame

时间:2017-03-10 22:57:14

标签: apache-spark pyspark pyspark-sql

我是非常新的Apache Spark。我正在尝试将csv文件加载到Spark RDD和DataFrames中。

我使用RDD操作数据和Dataframe for SQL,就像数据框上的操作一样。

将RDD转换为Spark DataFrame时遇到了问题。问题陈述如下。

# to load data
dataRDD = sc.textFile(trackfilepath)
# To use it as a csv      
dataRDD = testData.mapPartitions(lambda x: csv.reader(x)) 
# To load into data frame and capture the schema
dataDF = sqlContext.read.load(trackfilepath, 
                      format='com.databricks.spark.csv', 
                      header='true', 
                      inferSchema='true')
schema = dataDF.schema

数据看起来像

print (dataRDD.take(3))
[['Name', 'f1', 'f2', 'f3', 'f4'], ['Joe', '5', '7', '8', '3'], ['Jill', '3', '2', '2', '23']]

print (dataDF.take(3))
[Row(_c0='Name', _c1='f1', _c2='f2', _c3='f3', _c4='f4'), Row(_c0='Joe', _c1='5', _c2='7', _c3='8', _c4='3'), Row(_c0='Jill', _c1='3', _c2='2', _c3='2', _c4='23')]

print schema
StructType(List(StructField(Name,StringType,true),StructField(f1,IntegerType,true),StructField(f2,IntegerType,true),StructField(f3,IntegerType,true),StructField(f4,IntegerType,true)))

数据操作

def splitWords(line):
    return ['Jillwa' if item=='Jill' else item for item in line]

dataCleanRDD = dataRDD.map(splitWords)

问题:

现在我尝试使用以下代码和架构将操纵的RDD存储到DataFrame中。

dataCleanDF = sqlContext.createDataFrame(dataCleanRDD, schema=schema)

这给了我以下错误:

TypeError: IntegerType can not accept object 'f1' in type <class 'str'>

错误是由于RDD和模式中值的数据类型不匹配造成的。 RDD将每个事物视为String,并且模式具有field1 field2的整数,依此类推。这是一个虚拟数据集,我的真实数据集由200列和100,000行组成。因此,我很难手动将RDD值更改为整数。

我想知道是否有办法在RDD值上强制架构。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

如果您想阅读带有架构的csv,我建议您执行以下操作:

df = sqlContext.read.format("com.databricks.spark.csv")
    .schema(dataSchema)
            .option("header", "false")
            .option("delimiter", ",")
            .option("inferSchema", "true")
            .option("treatEmptyValuesAsNulls", "true")
            .option("nullValue", "null")
            .load("data.csv")

因此,您将获得带有架构的数据,并且您可以对它们进行操作,而不是使用带有udf的列的地图,因此您始终拥有列名称。

此外,如果你有更大的数据集,首先将其保存为镶木地板或ORC格式,然后再次阅读以执行操作,这将为您节省大量错误,并且您的性能将非常高。