当前位置: 首页 > 知识库问答 >
问题:

pyspark:TypeError:整型无法接受类型中的对象

空翼
2023-03-14

在Spark群集上使用pyspark编程时,数据很大,而且是零碎的,因此无法加载到内存中或轻松检查数据的完整性

基本上看起来

af.b Current%20events 1 996
af.b Kategorie:Musiek 1 4468
af.b Spesiaal:RecentChangesLinked/Gebruikerbespreking:Freakazoid 1 5209
af.b Spesiaal:RecentChangesLinked/Sir_Arthur_Conan_Doyle 1 5214

维基百科数据:

我从aws S3中阅读了它,然后尝试在pyspark intepreter中使用以下python代码构建spark数据框架:

parts = data.map(lambda l: l.split())
wikis = parts.map(lambda p: (p[0], p[1],p[2],p[3]))


fields = [StructField("project", StringType(), True),
StructField("title", StringType(), True),
StructField("count", IntegerType(), True),
StructField("byte_size", StringType(), True)] 

schema = StructType(fields) 

df = sqlContext.createDataFrame(wikis, schema)

所有看起来都很好,只有createDataFrame给我错误

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/spark/python/pyspark/sql/context.py", line 404, in   createDataFrame
rdd, schema = self._createFromRDD(data, schema, samplingRatio)
File "/usr/lib/spark/python/pyspark/sql/context.py", line 298, in _createFromRDD
_verify_type(row, schema)
File "/usr/lib/spark/python/pyspark/sql/types.py", line 1152, in _verify_type
_verify_type(v, f.dataType)
File "/usr/lib/spark/python/pyspark/sql/types.py", line 1136, in _verify_type
raise TypeError("%s can not accept object in type %s" % (dataType, type(obj)))
TypeError: IntegerType can not accept object in type <type 'unicode'>

为什么我不能将第三列count设置为IntegerType?我如何解决这个问题?

共有2个答案

艾浩穰
2023-03-14

使用apache 2.0,您可以让Spark推断数据的模式。总的来说,您需要在解析器函数中进行转换,如上所述:

当schema为None时,它将尝试从数据推断架构(列名和类型),数据应为Row、namedtuple或dict的RDD

西门旻
2023-03-14

正如ccheneson所指出的,您传递了错误的类型。

假设您的数据如下所示:

data = sc.parallelize(["af.b Current%20events 1 996"])

在第一张地图之后,您将获得RDD[List[String]]

parts = data.map(lambda l: l.split())
parts.first()
## ['af.b', 'Current%20events', '1', '996']

第二个映射将其转换为元组(String,String,String,String):

wikis = parts.map(lambda p: (p[0], p[1], p[2],p[3]))
wikis.first()
## ('af.b', 'Current%20events', '1', '996')

您的模式指出,第三列是一个整数:

[f.dataType for f in schema.fields]
## [StringType, StringType, IntegerType, StringType]

模式最常用于避免全表扫描来推断类型,并且不执行任何类型转换。

您可以在上次映射期间强制转换数据:

wikis = parts.map(lambda p: (p[0], p[1], int(p[2]), p[3]))

或将计数定义为StringType和cast列

fields[2] = StructField("count", StringType(), True)
schema = StructType(fields) 

wikis.toDF(schema).withColumn("cnt", col("count").cast("integer")).drop("count")

另一方面,count是SQL中的保留字,不应用作列名。在Spark中,它在某些情况下会按预期工作,而在另一种情况下会失败。

 类似资料:
  • 我试图实现一个接受泛型参数的函数定义,只要它扩展了另一个特定的泛型类型。简言之参数A必须扩展参数B,其中A和B都是泛型的。 下面是我的示例 用法示例如下 一些封闭的班级 和函数调用 我不想在抽象类声明中定义E,因为T已经在那里定义了。 我也试着做了以下几点: 将myList定义为接受扩展T的键 将E定义为T类型(无法找到如何指定它在函数中扩展T 但它从来都不起作用。有没有办法做到这一点?我在Sta

  • 问题内容: 我想制作这种形式的通用类: 问题是,我希望T可以是整数或Long,但不能接受Double。因此,仅有的两个可接受的声明将是: 有什么办法吗? 问题答案: 答案是不。至少没有办法使用泛型类型做到这一点。我建议结合使用泛型和工厂方法来执行您想要的操作。 这样可以确保只能创建和实例。尽管您仍然可以声明类型的变量,但它必须为null。

  • 问题内容: 尝试将类类型的对象添加到 JArray时 遇到以下错误。 这是我正在使用的代码: 在运行程序时,我将其命名如下: 如何转换 _JArray(JArray) 内的 AmountModel(类) 以被系统识别为JSON对象? 非常感谢您的回答。 谢谢。 问题答案: 为了将任意非原始POCO添加到中,您必须使用以下重载之一显式序列化它: (另请注意,我已更正了循环中的结束条件。它是,导致出现

  • 本文向大家介绍Go语言的方法接受者类型用值类型还是指针类型?,包括了Go语言的方法接受者类型用值类型还是指针类型?的使用技巧和注意事项,需要的朋友参考一下 概述 很多人(特别是新手)在写 Go 语言代码时经常会问一个问题,那就是一个方法的接受者类型到底应该是值类型还是指针类型呢,Go 的 wiki 上对这点做了很好的解释,我来翻译一下。 何时使用值类型 1.如果接受者是一个 map,func 或者

  • 这似乎很奇怪,这并不像我预期的那样有效。我编写了一个简单的java类,它实现了可比接口并重写了compareTo()方法。但是,它不允许我传递Object以外的特定类型的参数。我在网上查看了其他人的代码,他们确实使用了其他类型的对象,我将他们的代码复制到eclipse中,但我仍然得到了同样的错误。 我的问题是;我必须做什么来比较这个对象和类型的对象,让我们说Person。比较器接口(compare

  • 问题内容: 我正在尝试将我的数据ID postgresql从字符串迁移到Django中的整数,以便在狮身人面像搜索中使用它们。所以首先我要进行数据迁移,将我的数据转换为像这样的字符串整数 然后我要进行架构迁移 但是我遇到了一个错误 错误:运算符类“ varchar_pattern_ops”不接受数据类型整数 SQL-褋芯褋褌芯褟薪弱武器:42804 在South和pgAdmin中都会发生此错误。数