使用DataFrame.schema.fields.update

时间:2017-06-28 04:48:05

标签: apache-spark apache-spark-sql

我想在我的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

我想知道的是为什么会发生这种错误,我该如何解决? 非常感谢!

1 个答案:

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

返回的StructField数组

希望这有帮助