OrientDB: java.lang.IllegalArgumentException 属性 值不能为空
OrientDB: java.lang.IllegalArgumentException Property value can not be null
我在 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()
我该如何解决这个问题?
用户class:
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)
这里的问题是由于并非所有列都是数字。更具体地说,具有空值的列不是数字。使用 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
我在 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()
我该如何解决这个问题?
用户class:
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)
这里的问题是由于并非所有列都是数字。更具体地说,具有空值的列不是数字。使用 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