我在OrientDb数据库中使用图形边缘保存DataFrame。 但是我收到以下错误:
FAILED, exitCode: 15, (reason: User class threw exception: java.lang.RuntimeException: An exception was thrown: Job aborted due to stage failure: Task 0 in stage 96.0 failed 4 times, most recent failure: Lost task 0.3 in stage 96.0 (TID 7333, myambarislave2.local.test.org, executor 1): java.lang.IllegalArgumentException: Property value can not be null
我无法手动修改DataFrame,因为它非常庞大。但我使用.na.fill(0)
。
df_edges
.na.fill(0)
.coalesce(1)
.write
.format("org.apache.spark.orientdb.graphs")
.option("dburl", uri)
.option("user", username)
.option("password", password)
.option("vertextype", "User")
.option("edgetype", "UserEdge")
.mode(SaveMode.Overwrite)
.save()
我该如何解决这个问题?
用户类:
val user: OrientVertexType = graph.createVertexType("User")
user.createProperty("CommunityId", OType.INTEGER)
user.createProperty("CommunityName", OType.STRING)
user.createProperty("UserId", OType.INTEGER)
user.createProperty("UserName", OType.STRING)
user.createProperty("NumberOfInfluencedUsers", OType.INTEGER)
user.createProperty("AuthorEngagementRate", OType.DOUBLE)
user.createProperty("Role_In", OType.STRING)
user.createProperty("Role_Out", OType.STRING)
user.createProperty("OutDegree", OType.INTEGER)
答案 0 :(得分:1)
这里的问题是由于并非所有列都是数字的。更具体地说,具有空值的列不是数字。使用na.fill(0)
时,Spark只会替换类型为0的列中的空值,即所有数字列。
要替换字符串列中的空值,最简单的方法是使用na.fill("0")
并替换" 0"用你想要替换的任何东西。否则,可以使用na.drop()
删除具有空值的行。
如果要根据列填充不同的值,可以使用Map
。这还具有能够为不同类型的列设置不同值的益处。例如:
df.na.fill(Map(
"A" -> "Undefined",
"B" -> 0.0
))
更进一步,您可以根据列类型自动创建Map
:
val typeMap = df.dtypes.map(col =>
col._2 match {
case "IntegerType" => (col._1 -> 0)
case "StringType" => (col._1 -> "Undefined")
case "DoubleType" => (col._1 -> 0.0)
}).toMap