Pyspark 如何推断现有Spark数据帧的数据类型?

Pyspark 如何推断现有Spark数据帧的数据类型?,pyspark,schema,etl,aws-glue,pyspark-dataframes,Pyspark,Schema,Etl,Aws Glue,Pyspark Dataframes,我已将一个长数据帧旋转到宽数据帧。这个新的数据框架有更多的新变量从枢轴中产生。这些都是Spark数据框中的stringType。我如何才能让pyspark重新推断这些新列的数据类型,以便将小数识别为float/double而不是字符串 背景:每个表中这些新列的数量和数据透视表的数量太大,无法手动构建模式 如果PySpark中有类似于Pandas的推断对象(),那就太好了。我不能使用Pandas,因为该工作位于AWS Glue Spark中,它不提供Pandas库。您可以使用类来处理您的问题。您可

我已将一个长数据帧旋转到宽数据帧。这个新的数据框架有更多的新变量从枢轴中产生。这些都是Spark数据框中的stringType。我如何才能让pyspark重新推断这些新列的数据类型,以便将小数识别为float/double而不是字符串

背景:每个表中这些新列的数量和数据透视表的数量太大,无法手动构建模式

如果PySpark中有类似于Pandas的
推断对象()
,那就太好了。我不能使用Pandas,因为该工作位于AWS Glue Spark中,它不提供Pandas库。

您可以使用类来处理您的问题。您可以选择文档中列出的操作类型之一

强制转换:允许您指定要强制转换到的类型(例如,cast:int)

make_cols:通过展平数据来解决潜在的歧义。例如,如果columnA可以是int或字符串,则解决方案是在生成的DynamicFrame中生成两个名为columnA_int和columnA_string的列

make_struct:通过使用结构表示数据来解决潜在的歧义。例如,如果列中的数据可以是int或字符串,则使用make_struct操作在生成的DynamicFrame中生成一列结构,每个结构同时包含int和字符串

项目:通过在生成的DynamicFrame中仅保留指定类型的值来解决潜在的歧义。例如,如果ChoiceType列中的数据可以是int或string,则指定project:string操作会从生成的DynamicFrame中删除非string类型的列

要首先检查所有可能的类型,可以使用make_struct action type,然后使用cast action,或者使用make_cols action type和glue生成所有可能的类型作为新列

我将在下面分享示例代码块

resolvechoiceA = ResolveChoice.apply(frame = datasourceA, choice = "make_cols", transformation_ctx = "resolvechoiceA")
我希望这个答案能解决你的问题。

好的,给你。 截至2020年2月,除了使用
expert_objects()
form Pandas外,PySpark中没有解决此问题的方法。如果你不能使用熊猫,因为你在AWS胶水,那么你是幸运和不幸的。不幸的是——因为熊猫不在;幸运-因为还有更好的东西,那就是Scala中的
recomputeSchema()

你所要做的就是

  • 从DynamicFrame
    dyf开始
  • 使用
    dyf.\u jdf
  • 使用Scala
    dyf.\u jdf.recomputeSchema()
    中的
    recomputeSchema()
    方法,该方法返回模式
  • 使用
    toString()
    方法和
    \u反序列化\u json\u字符串()
    函数捕获模式
  • 代码应该是

        from awsglue.gluetypes import _deserialize_json_string
        newSchema=_deserialize_json_string( dyf._jdf.recomputeSchema().toString() ) )
    

    然后,您可以解决serkan提到的选择问题。

    也许这会有所帮助:Thx Mr Joseph,如果没有更好的解决方案,这种方法值得考虑。只是在许多表上运行它,每个表都有许多列可能会很麻烦。哦如果一个float列中缺少一个值,它就不起作用了。对不起,serkan,我想你误解了这个问题。数据帧已经存在,没有选择要解决!所有新列都是stringType。我需要从PySpark运行recomputeSchema(Scala方法)。如果您知道如何通过sc.\U jvm做到这一点,那将是appreciated@axiom根据您的问题,我的理解是您只想更改数据帧中的类型。所以你的选择就是这样。