我想在我的DataFrame中投两列。这是我的代码:
val session = SparkSession
.builder
.master("local")
.appName("UDTransform").getOrCreate()
var df: DataFrame = session.createDataFrame(Seq((1, "Spark", 111), (2, "Storm", 112), (3, "Hadoop", 113), (4, "Kafka", 114), (5, "Flume", 115), (6, "Hbase", 116)))
.toDF("CID", "Name", "STD")
df.printSchema()
df.schema.fields.update(0, StructField("CID", StringType))
df.schema.fields.update(2, StructField("STD", StringType))
df.printSchema()
df.show()
我从我的控制台获取这些日志:
root
|-- CID: integer (nullable = false)
|-- Name: string (nullable = true)
|-- STD: integer (nullable = false)
root
|-- CID: string (nullable = true)
|-- Name: string (nullable = true)
|-- STD: string (nullable = true)
17/06/28 12:44:32 ERROR CodeGenerator: failed to compile: org.codehaus.commons.compiler.CompileException: File 'generated.java', Line 36, Column 31: A method named "toString" is not declared in any enclosing class nor any supertype, nor through a static import
我想知道的是为什么会发生这种错误,我该如何解决? 非常感谢!
答案 0 :(得分:2)
您无法更新数据帧的架构,因为数据帧是不可变的, 但您可以更新数据帧的架构并分配给新的Dataframe。
您可以这样做
root
|-- CID: string (nullable = true)
|-- Name: string (nullable = true)
|-- STD: string (nullable = true)
newDF的架构是
df.schema.fields.update(0, StructField("CID", StringType))
df.schema.fields.update(2, StructField("STD", StringType))
df.printSchema()
df.show()
您的代码:
df.schema.fields
在您的代码中
Array
返回StructFields
Array[StructFields]
作为
df.schema.fields.update(0, StructField("CID", StringType))
然后如果您尝试更新为
Array[StructField]
这会更新0th
位置DataFrame.schema.fields.update
的值,我不是您想要的
DataFrame.schema.fields
不更新数据帧架构,而是更新{{1}}
希望这有帮助