这可能是一个愚蠢的问题,源于我的无知。我已经在 PySpark 上工作了几个星期,并没有太多的编程经验可以开始。
我的理解是,在 Spark 中,RDD、数据帧和数据集都是不可变的——我再次理解,这意味着您无法更改数据。如果是这样,为什么我们能够使用 编辑 Dataframe 的现有列withColumn()?
我在这里浏览了文档:https : //spark.apache.org/docs/latest/api/python/pyspark.sql.html
它说:
和前面的问题也提到了它。但是,我仍然不明白它们究竟有何不同,以及在选择其中一个时会产生什么影响?
更重要的是,如果 repartition 进行哈希分区,提供列作为其参数有什么影响?
如下面的代码所示,我正在将一个 JSON 文件读入一个数据帧,然后从该数据帧中选择一些字段到另一个字段中。
df_record = spark.read.json("path/to/file.JSON",multiLine=True)
df_basicInfo = df_record.select(col("key1").alias("ID"), \
col("key2").alias("Status"), \
col("key3.ResponseType").alias("ResponseType"), \
col("key3.someIndicator").alias("SomeIndicator") \
)
Run Code Online (Sandbox Code Playgroud)
问题是,有时,JSON 文件没有我尝试获取的某些键,例如ResponseType. 所以它最终会抛出如下错误:
org.apache.spark.sql.AnalysisException: No such struct field ResponseType
Run Code Online (Sandbox Code Playgroud)
如何在不强制使用模式的情况下解决此问题?当它不可用时,是否可以使其在该列下返回 NULL?
我如何检测 spark 数据帧是否有列确实提到了如何检测数据帧中的列是否可用。然而,这个问题是关于如何使用该功能。
我有一个包含两列的数据框:filename和year。我想filename用year列中的值替换年份值
下表中的第三列显示了要求:
+----------------------------+------+----------------------------+
| filename | year | reqd_filename |
+----------------------------+------+----------------------------+
| blah_2020_v1_blah_blah.csv | 1975 | blah_1975_v1_blah_blah.csv |
+----------------------------+------+----------------------------+
| blah_2019_v1_blah_blah.csv | 1984 | blah_1984_v1_blah_blah.csv |
+----------------------------+------+----------------------------+
Run Code Online (Sandbox Code Playgroud)
代码目前如下所示:
df = df.withColumn('filename', F.regexp_replace(F.col('filename',), '(blah_)(.*)(_v1.*)', <Nothing I put here works>))
Run Code Online (Sandbox Code Playgroud)
简而言之,我想用yeardf 中的列替换第二组
python apache-spark apache-spark-sql pyspark pyspark-dataframes
StackOverflow 有一些关于如何更新数据框中嵌套列的答案。但是,其中一些看起来有点复杂。
在搜索时,我从 DataBricks 中找到了处理相同场景的文档:https ://docs.databricks.com/user-guide/faq/update-nested-column.html
val updated = df.selectExpr("""
named_struct(
'metadata', metadata,
'items', named_struct(
'books', named_struct('fees', items.books.fees * 1.01),
'paper', items.paper
)
) as named_struct
""").select($"named_struct.metadata", $"named_struct.items")
Run Code Online (Sandbox Code Playgroud)
这看起来也很干净。不幸的是,我不知道 Scala。我将如何将其翻译成 Python?