OrientDB:java.lang.IllegalArgumentException属性值不能为null

时间:2018-06-19 07:57:11

标签: scala apache-spark apache-spark-sql orientdb

我在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)

1 个答案:

答案 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