芒泽儿 2023-03-27 15:02 采纳率: 100%
浏览 33
已结题

SparkSQL编程:DataFrame创建

为什么我已经改了数据类型还是报错啊,希望各位帮助解决一下


org.apache.spark.api.python.PythonException: Traceback (most recent call last):
  File "/usr/local/spark/python/lib/pyspark.zip/pyspark/worker.py", line 377, in main
    process()
  File "/usr/local/spark/python/lib/pyspark.zip/pyspark/worker.py", line 372, in process
    serializer.dump_stream(func(split_index, iterator), outfile)
  File "/usr/local/spark/python/lib/pyspark.zip/pyspark/serializers.py", line 400, in dump_stream
    vs = list(itertools.islice(iterator, batch))
  File "/usr/local/spark/python/lib/pyspark.zip/pyspark/util.py", line 99, in wrapper
    return f(*args, **kwargs)
  File "/usr/local/spark/python/pyspark/sql/session.py", line 730, in prepare
    verify_func(obj)
  File "/usr/local/spark/python/pyspark/sql/types.py", line 1391, in verify
    verify_value(obj)
  File "/usr/local/spark/python/pyspark/sql/types.py", line 1372, in verify_struct
    verifier(v)
  File "/usr/local/spark/python/pyspark/sql/types.py", line 1391, in verify
    verify_value(obj)
  File "/usr/local/spark/python/pyspark/sql/types.py", line 1317, in verify_integer
    verify_acceptable_types(obj)
  File "/usr/local/spark/python/pyspark/sql/types.py", line 1280, in verify_acceptable_types
    % (dataType, obj, type(obj))))
TypeError: field id: IntegerType can not accept object '3' in type <class 'str'>


```python
from pyspark.sql import Row
from pyspark.sql.types import *
from pyspark import SparkContext,SparkConf
from pyspark.sql import SparkSession

spark = SparkSession.builder.config(conf = SparkConf()).getOrCreate()

#设置模式信息
schema = StructType([StructField("id",IntegerType(),True),StructField("name",StringType(),True),StructField("gender",StringType(),True),StructField("age",IntegerType(),True)])

#创建RDD
employeeRDD = spark.sparkContext.parallelize(["3 Mary F 26","4 Tom M 23"]).map(lambda x:x.split(" "))

#创建Row对象
rowRDD = employeeRDD.map(lambda p:Row(int(p[0].strip()),p[1].strip(),p[2].strip(),int(p[3].strip())))

#建立Row对象与模式之间的对应关系,即把数据与模式对应起来
employeeDF = spark.createDataFrame(employeeRDD,schema)
  • 写回答

2条回答 默认 最新

  • 星拱北辰 Python领域优质创作者 2023-03-27 15:25
    关注

    我试着回答一下:

    这个错误的原因是因为 employeeRDD 是一个包含字符串的 RDD,当使用 createDataFrame() 函数创建 DataFrame 时,Spark 无法将字符串转换为模式中定义的整数类型,因此会抛出 TypeError 异常。
    解决方法是使用 rowRDD 替换 employeeRDD,因为 rowRDD 中的数据已经按照模式定义进行了类型转换。
    最后一行代码改为employeeDF = spark.createDataFrame(rowRDD,schema)

    如果我的回答对你有帮助,还望采纳

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月4日
  • 已采纳回答 3月27日
  • 修改了问题 3月27日
  • 创建了问题 3月27日

悬赏问题

  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改