Java 以编程方式推断模式以准备spark数据帧数据集<;世界其他地区>;来自RDD<;世界其他地区>;当某些行对象可能包含不同数量的元素时

Java 以编程方式推断模式以准备spark数据帧数据集<;世界其他地区>;来自RDD<;世界其他地区>;当某些行对象可能包含不同数量的元素时,java,apache-spark,neo4j,Java,Apache Spark,Neo4j,我正在使用获取spark rdd中的neo4j节点信息。我可以通过调用获取RDD。但当我尝试获取dataframe调用时,它会抛出异常(如果发现堆栈跟踪太长,则跳过堆栈跟踪,因为最终主要问题可能会有所不同): 我没能从上面的大赛中得到什么 因此,我采用了JavaRDD,并尝试通过编程指定将其转换为DataFrame 这起作用了 因此,我检查了所有节点,并意识到并非所有节点(即JavaRDD中的所有Rows)都具有相同数量的属性。这一定是导致数据帧准备失败的原因。我是否可以通过编程的方式来处理它,

我正在使用获取spark rdd中的neo4j节点信息。我可以通过调用获取
RDD
。但当我尝试获取dataframe调用时,它会抛出异常(如果发现堆栈跟踪太长,则跳过堆栈跟踪,因为最终主要问题可能会有所不同):

我没能从上面的大赛中得到什么

因此,我采用了
JavaRDD
,并尝试通过编程指定将其转换为
DataFrame

这起作用了


因此,我检查了所有节点,并意识到并非所有节点(即
JavaRDD
中的所有
Row
s)都具有相同数量的属性。这一定是导致数据帧准备失败的原因。我是否可以通过编程的方式来处理它,而无需执行此操作。

如果您希望使用您提到的RDD来完成此操作,请执行以下操作:

Row row1 = RowFactory.create("val1", " val2", "val3", "val4", "val5", "val6", 152214d, "val7", 152206d, 11160d, "val8");
List<StructField> fields = new ArrayList<StructField>();
fields.add(DataTypes.createStructField("attr1", DataTypes.StringType, true));
fields.add(DataTypes.createStructField("attr2", DataTypes.StringType, true));
fields.add(DataTypes.createStructField("attr3", DataTypes.StringType, true));
fields.add(DataTypes.createStructField("attr4", DataTypes.StringType, true));
fields.add(DataTypes.createStructField("attr5", DataTypes.StringType, true));
fields.add(DataTypes.createStructField("attr6", DataTypes.StringType, true));
fields.add(DataTypes.createStructField("attrd1", DataTypes.DoubleType, true));
fields.add(DataTypes.createStructField("attr7", DataTypes.StringType, true));
fields.add(DataTypes.createStructField("attrd2", DataTypes.DoubleType, true));
fields.add(DataTypes.createStructField("attrd3", DataTypes.DoubleType, true));
fields.add(DataTypes.createStructField("attr8", DataTypes.StringType, true));
  • 在尝试将(RDD+模式)转换为数据帧之前, 检查RDD(使用map函数),确保每一行都具有所有相关属性
  • 如果一行中不存在属性,则添加该属性并将其设为null

在这之后,您的RDD行将具有相同的模式,并且到数据帧的转换将起作用。

在使用RDD行的过程中,我意识到了一些我想在这里分享的事情

  • 一般来说,如果要准备数据帧,最好不要返回neo4j的对象类型,特别是节点和关系。如下所示,返回节点不可取:

    MATCH(n {id:'xyz'}) RETURN n
    
    而是返回属性:

    MATCH(n {id:'xyz'}) RETURN properties(n)
    
  • 如果不确定所有节点的属性数是否相同,那么最好显式返回它们,而不是返回属性并获取JavaRDD。因为这需要我们再次处理
    JavaRDD
    ,为不存在的属性添加
    NULL
    。也就是说,不是这样做:

    MATCH(n {id:'xyz'}) RETURN properties(n)
    
    以这种方式返回:

    MATCH(n {id:'xyz'}) RETURN n.prop1 AS prop1, n.prop2 AS prop2, ..., n.propN AS propN
    
    Neo4j本身将为不存在的属性添加
    NULL
    s,如下图所示,我们不必再次迭代它们。通过返回该值,我可以使用
    loadDataframe()
    方法直接获取neo4j节点信息

  • MATCH(n {id:'xyz'}) RETURN properties(n)
    
    MATCH(n {id:'xyz'}) RETURN n.prop1 AS prop1, n.prop2 AS prop2, ..., n.propN AS propN