Apache spark 在将RDD转换为DataFrame时在RDD上强制实施模式

Apache spark 在将RDD转换为DataFrame时在RDD上强制实施模式,apache-spark,pyspark,pyspark-sql,Apache Spark,Pyspark,Pyspark Sql,我是非常新的阿帕奇火花。我正在尝试将csv文件加载到Spark RDD和数据帧中 我使用RDD操作数据和数据帧,以便在数据帧上执行类似SQL的操作 在将RDD转换为Spark数据帧时,我遇到了一个问题。问题陈述如下 # to load data dataRDD = sc.textFile(trackfilepath) # To use it as a csv dataRDD = testData.mapPartitions(lambda x: csv.reader(x)) # To

我是非常新的阿帕奇火花。我正在尝试将csv文件加载到Spark RDD和数据帧中

我使用RDD操作数据和数据帧,以便在数据帧上执行类似SQL的操作

在将RDD转换为Spark数据帧时,我遇到了一个问题。问题陈述如下

# 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
数据看起来像 数据操纵 问题是: 现在,我尝试使用下面的代码和模式将被操纵的RDD存储到数据帧中

dataCleanDF = sqlContext.createDataFrame(dataCleanRDD, schema=schema)
这给了我以下错误:

TypeError: IntegerType can not accept object 'f1' in type <class 'str'>
TypeError:IntegerType无法接受类型中的对象“f1”
该错误是由于RDD和模式中的值的数据类型不匹配造成的。RDD将所有内容都视为一个字符串,模式对field1和field2都有整数,依此类推。这是一个虚拟数据集,我的真实数据集由200列和100000行组成。因此,我很难手动将RDD值更改为整数


我想知道是否有办法强制RDD值使用模式。任何帮助都将不胜感激。

如果您想阅读带有模式的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格式,然后再次读取以执行操作,这将为您节省大量错误,并且您的性能将非常高。

谢谢,您的“udf”建议真的很有帮助
TypeError: IntegerType can not accept object 'f1' in type <class 'str'>
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")