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