当前位置: 首页 > 面试题库 >

遇到缺少功能时,Apache Spark引发NullPointerException

高宏峻
2023-03-14
问题内容

当索引要素中的字符串列时,PySpark有一个奇怪的问题。这是我的tmp.csv文件:

x0,x1,x2,x3 
asd2s,1e1e,1.1,0
asd2s,1e1e,0.1,0
,1e3e,1.2,0
bd34t,1e1e,5.1,1
asd2s,1e3e,0.2,0
bd34t,1e2e,4.3,1

在这里我有一个’x0’的缺失值。首先,我使用pyspark_csv将csv文件中的功能读取到DataFrame中:https : //github.com/seahboonsiew/pyspark-
csv,
然后使用StringIndexer索引x0:

import pyspark_csv as pycsv
from pyspark.ml.feature import StringIndexer

sc.addPyFile('pyspark_csv.py')

features = pycsv.csvToDataFrame(sqlCtx, sc.textFile('tmp.csv'))
indexer = StringIndexer(inputCol='x0', outputCol='x0_idx' )
ind = indexer.fit(features).transform(features)
print ind.collect()

当调用``ind.collect()’‘时,Spark抛出java.lang.NullPointerException。对于完整的数据集,一切都工作正常,例如,对于“
x1”。

有谁知道这是什么原因以及如何解决?

提前致谢!

谢尔盖

更新:

我使用Spark 1.5.1。确切的错误:

File "/spark/spark-1.4.1-bin-hadoop2.6/python/pyspark/sql/dataframe.py", line 258, in show
print(self._jdf.showString(n))

File "/spark/spark-1.4.1-bin-hadoop2.6/python/lib/py4j-0.8.2.1-src.zip/py4j/java_gateway.py", line 538, in __call__

File "/spark/spark-1.4.1-bin-hadoop2.6/python/lib/py4j-0.8.2.1-src.zip/py4j/protocol.py", line 300, in get_return_value

py4j.protocol.Py4JJavaError: An error occurred while calling o444.showString.
: java.lang.NullPointerException
at org.apache.spark.sql.types.Metadata$.org$apache$spark$sql$types$Metadata$$hash(Metadata.scala:208)
at org.apache.spark.sql.types.Metadata$$anonfun$org$apache$spark$sql$types$Metadata$$hash$2.apply(Metadata.scala:196)
at org.apache.spark.sql.types.Metadata$$anonfun$org$apache$spark$sql$types$Metadata$$hash$2.apply(Metadata.scala:196)
... etc

我试图创建相同的DataFrame而不读取csv文件,

df = sqlContext.createDataFrame(
  [('asd2s','1e1e',1.1,0), ('asd2s','1e1e',0.1,0), 
  (None,'1e3e',1.2,0), ('bd34t','1e1e',5.1,1), 
  ('asd2s','1e3e',0.2,0), ('bd34t','1e2e',4.3,1)],
  ['x0','x1','x2','x3'])

它给出了相同的错误。有点不同的例子很好用,

df = sqlContext.createDataFrame(
  [(0, None, 1.2), (1, '06330986ed', 2.3), 
  (2, 'b7584c2d52', 2.5), (3, None, .8), 
  (4, 'bd17e19b3a', None), (5, '51b5c0f2af', 0.1)],
  ['id', 'x0', 'num'])

// after indexing x0

+---+----------+----+------+
| id|        x0| num|x0_idx|
+---+----------+----+------+
|  0|      null| 1.2|   0.0|
|  1|06330986ed| 2.3|   2.0|
|  2|b7584c2d52| 2.5|   4.0|
|  3|      null| 0.8|   0.0|
|  4|bd17e19b3a|null|   1.0|
|  5|51b5c0f2af| 0.1|   3.0|
+---+----------+----+------+

更新2:

我刚刚在Scala中发现了相同的问题,所以我想这是Spark漏洞,而不仅仅是PySpark。特别是数据帧

val df = sqlContext.createDataFrame(
  Seq(("asd2s","1e1e",1.1,0), ("asd2s","1e1e",0.1,0), 
      (null,"1e3e",1.2,0), ("bd34t","1e1e",5.1,1), 
      ("asd2s","1e3e",0.2,0), ("bd34t","1e2e",4.3,1))
).toDF("x0","x1","x2","x3")

索引“ x0”功能时,抛出java.lang.NullPointerException。此外,当在随后的数据帧中索引“ x0”时

val df = sqlContext.createDataFrame(
  Seq((0, null, 1.2), (1, "b", 2.3), 
      (2, "c", 2.5), (3, "a", 0.8), 
      (4, "a", null), (5, "c", 0.1))
).toDF("id", "x0", "num")

我有“ java.lang.UnsupportedOperationException:不支持任何类型的模式”,这是由于在第5个向量中缺少“
num”值引起的。如果用一个数字代替它,那么即使第一个向量中缺少值,一切也都可以正常工作。

我还尝试了旧版本的Spark(1.4.1),结果是相同的。


问题答案:

看起来您正在使用的模块将空字符串转换为null,并且在某些时候将下游处理弄乱了。乍一看,它看起来像是PySpark错误。

如何解决?一个简单的解决方法是在索引之前删除空值:

features.na.drop()

或将空值替换为某些占位符:

from pyspark.sql.functions import col, when

features.withColumn(
    "x0", when(col("x0").isNull(), "__SOME_PLACEHOLDER__").otherwise(col("x0")))

另外,您可以使用spark-csv。它高效,经过测试,而且不能将空字符串转换为nulls

features = (sqlContext.read
    .format('com.databricks.spark.csv')
    .option("inferSchema", "true")
    .option("header", "true")
    .load("tmp.csv"))


 类似资料:
  • 我已经安装Kibana版本6.5。我选择了30天免费试用,并启用了x-pack安全选项。 通过KibanaUI我创建了一个用户并分配了报告所需的两个角色-kibana_user和reporting_user。现在我通过这个新用户登录,但在仪表板上找不到报告选项。 即使我使用具有超级用户角色的elastic用户登录,行为也是一样的。我错过什么了吗? 我在Kibana startup上看到一条日志,上

  • 我正在尝试为我的容器配置网络选项,但在尝试以下命令时: 我得到以下结果: root@Server02:/var/lib#lxc网络创建测试br0 用法:lxc[选项] 检查可用命令列表,我不认为网络是一个选项 以下是我看到的可用命令: 配置,复制,删除,执行,文件,手指,图像,信息,初始化,启动,列表,监控,移动,暂停,配置文件,发布,远程,重启,恢复,快照,启动,停止,版本 我正在使用Ubunt

  • 大多数Web应用程序在使用户可以访问该功能之前验证功能级别访问权限。但是,如果未在服务器上执行相同的访问控制检查,则黑客无法在未经适当授权的情况下进入应用程序。 我们将通过以下每项来了解这个漏洞的威胁代理,攻击向量,安全弱点,技术影响和业务影响。 威胁代理 - 具有网络访问权限的任何人都可以向应用程序发送请求。 攻击者的方法 - 谁是授权系统用户,只需将URL或参数更改为特权函数即可。 安全弱点

  • 我在教程中发现了以下示例代码: 但是当尝试使用它时,我只得到: 我的Typescript编译器告诉我这些方法是可用的,但是当检查它们丢失了。 我用了这个包裹。当前angualar2起始指南的json: ... 知道我在这一点上可能会出错吗?

  • 问题内容: 我正在使用Jersey上传文件。我定义了方法: 并调用Jersey客户的呼叫进行测试: 但是,我得到: 严重:缺少方法public java.util.Collection ImageResource.uploadImage(java.io.InputStream,com.sun.jersey.core.header.FormDataContentDisposition)的依赖关系将j

  • 我们将Spring Kafka与Spring Boot(所有最新版本)结合使用。我们将Kafka消息的处理转换为KafkaHandler注释方法,并期望有效的验证方法和有效的有效载荷能够确保有效载荷的验证,但事实并非如此。此功能适用于KafkaListener,是否也适用于KafkaHandler? 非常感谢。

  • 我正在重新设计我们公司的API以使用来自SQL Server的Snowflake。我们的第一个直接障碍是现有的SQL Server存储过程返回表输出,而Snowflake不允许这种类型的输出。我不想完全重新设计一切,所以我在想: null 我知道对于编码来说,使用python这样的东西会容易得多,但是,我不想维护另一个python应用程序,只用于在Snowflake中检索数据。

  • 由于我们将Spring和RestyGwt移到Jackson 2映射器(Spring 4.1.1.Release,RestyGwt 2.0-Snapshot,Jackson 2.3.2)中,因此出现了此问题。它适用于较早的版本(Spring 4.0.7.Release、RestyGWT 1.4、Jackson 1.9.13)。 我怎么处理?