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