Java 如何从现有的Dataframe创建Dataframe,并将特定字段设置为Struct type?

Java 如何从现有的Dataframe创建Dataframe,并将特定字段设置为Struct type?,java,scala,apache-spark,dataframe,dataset,Java,Scala,Apache Spark,Dataframe,Dataset,我需要从现有的DataFrame创建一个DataFrame,在其中我还需要更改模式 我有一个数据帧,如: +-----------+----------+-------------+ |Id |Position |playerName | +-----------+-----------+------------+ |10125 |Forward |Messi | |10126 |Forward |Ronaldo | |1

我需要从现有的DataFrame创建一个DataFrame,在其中我还需要更改模式

我有一个数据帧,如:

+-----------+----------+-------------+
|Id         |Position   |playerName  |
+-----------+-----------+------------+
|10125      |Forward    |Messi       |
|10126      |Forward    |Ronaldo     |
|10127      |Midfield   |Xavi        |
|10128      |Midfield   |Neymar      |
我是使用下面给出的case类创建的:

case class caseClass (
                       Id: Int = "",
                       Position : String = "" ,
                       playerName : String = "" 
                     )
现在我需要在Struct type下创建Playernameposition

我需要用schema创建另一个数据帧

|--Id:int(nullable=true)

|--playerDetails:struct(nullable=true)

||--playername:string(nullable=true)

||--位置:字符串(nullable=true)

我通过引用链接创建了一个新的数据帧,代码如下

myschema是

  List(
    StructField("Id", IntegerType, true),
    StructField("Position",StringType, true),
    StructField("playerName", StringType,true)
)
我尝试了以下代码

  spark.sparkContext.parallelize(data),
  myschema
)
但我不能让它发生

我看到了类似的问题 但我不明白解决办法

在case类中是否有直接实现StructType的解决方案?因此,我认为我不需要创建自己的架构来创建结构类型值。

可以使用函数“struct”:

// data
val playersDF = Seq(
  (10125, "Forward", "Messi"),
  (10126, "Forward", "Ronaldo"),
  (10127, "Midfield", "Xavi"),
  (10128, "Midfield", "Neymar")
).toDF("Id", "Position", "playerName")

// action
val playersStructuredDF = playersDF.select($"Id", struct("playerName", "Position").as("playerDetails"))
// display
playersStructuredDF.printSchema()
playersStructuredDF.show(false)
输出:

root
 |-- Id: integer (nullable = false)
 |-- playerDetails: struct (nullable = false)
 |    |-- playerName: string (nullable = true)
 |    |-- Position: string (nullable = true)

+-----+------------------+
|Id   |playerDetails     |
+-----+------------------+
|10125|[Messi, Forward]  |
|10126|[Ronaldo, Forward]|
|10127|[Xavi, Midfield]  |
|10128|[Neymar, Midfield]|
+-----+------------------+

您的解决方案很好,但在我的例子中,val inputFile=spark.read.textFile(“C:\\Users\\adarsh.k\\Downloads\\players.txt”)inputFile.map(lines=>{val Id=extractFun(lines,““regex”))val position=extractFun(lines,““regex”“”))val playerName=extractFun(lines,““regex”“”)val playerName=extractFun(lines,““regex”“”)casecasclass.toDF()我将vlaues带到这样的case类中。我有一个使用regex提取数据的函数。使用此解决方案时,我在线程“main”org.apache.spark.sql.AnalysisException中遇到了一个错误:无法解析给定输入列:[value];的“
Id
”;;从原始数据提取到案例类似乎有问题,猜猜,这超出了原始问题的范围。对不起,这实际上是我的错误。我没有将inputFile.map作为数据帧。当我尝试val newData=inputFile.map(lines=>{……..}时,它对我很有效……非常感谢。现在我变得像[Messi,Forward]了,我能像[Messi:Forward]那样得到键值对吗??