我目前的问题是以下一个...
Exception in thread "main" org.apache.spark.sql.AnalysisException: expression 'mapField' cannot be used as a grouping expression because its data type map<string,string> is not an orderable data type.;;
我想要实现的只是基本上按给定的一组列对 DataFrame 中的条目进行分组,但是在与前面提到的 MapType 列分组时似乎失败了。
.groupBy(
...
"mapField",
...
)
Run Code Online (Sandbox Code Playgroud)
我有一些想法,但必须有一种更简单的方法来解决这个问题,而不是我想过的以下方法......
我已经得到了保存在 DF 中的连接字符串中的每个元素的键值,所以我可以将它们解析为 Map 然后使用 保存它withColumn,但还没有找到任何方法,我无法得到我的工作。这样做合理吗?
重新解析为 RDD 并将其分组,然后返回 DF(我认为太麻烦了)
编辑
示例输入
id | myMap
'sample' | Map('a' -> 1, 'b' -> 2, 'c' -> 3)
Run Code Online (Sandbox Code Playgroud)
期望输出
id | a | b | c
'sample' | 1 | 2 | 3
Run Code Online (Sandbox Code Playgroud) 我一直在阅读大量与此事相关的问题,但到目前为止没有一个对我有帮助。我目前正在使用 Pythonclick库将脚本作为命令执行。
我正在尝试执行的当前命令放置在具有__main__.py文件的 Python 包中,就像父目录一样。当前的项目结构如下。
/myproject
/foo_one
__init__.py
foo_one.py
/foo_two
__init__.py
foo_two.py
/foo_three
__init__.py
foo_three.py
/foo_four
__init__.py
foo_four.py
/foo_five
__init__.py
foo_five.py
/foo_six
__init__.py
foo_six.py
__init__.py
__main__.py
foo_seven.py
Run Code Online (Sandbox Code Playgroud)
每当我尝试运行__main__.py位于项目文件夹中的脚本时,都会出现以下错误。
ModuleNotFoundError: No module named '__main__.foo_two'; '__main__' is not a package
但是,如果我尝试使用这样的-m选项从上面的文件夹中执行相同的脚本python3 myproject -m,则会显示以下内容。
ImportError: attempted relative import with no known parent package
将__main__.py有2个进口这样的...的__init__.py是空的。
from .foo_two.foo_two import AClass, AnotherClass, OtherClass
from .foo_three.foo_three import AnotherClassMore
Run Code Online (Sandbox Code Playgroud)
更新:更正上一个命令中的语法错误,同时调用python -m myproject …
我一直在阅读有关该主题的几个问题,也阅读过几个论坛,在所有这些论坛中,他们似乎都提到从Spark生成的每个.parquet文件的大小应该为64MB或1GB,但仍然无法我想知道哪种情况属于每种文件大小,其背后的原因除了HDFS将它们分成64MB的块。
我当前的测试方案如下。
dataset
.coalesce(n) # being 'n' 4 or 48 - reasons explained below.
.write
.mode(SaveMode.Append)
.partitionBy(CONSTANTS)
.option("basepath", outputPath)
.parquet(outputPath)
Run Code Online (Sandbox Code Playgroud)
我目前总共处理2.5GB到3GB的每日数据,这些数据将被拆分并每年保存到每日存储桶中。的背后原因,“N”是4或48,只是出于测试目的,因为我知道我的测试集的提前大小,我尝试,我可以得到一些接近64MB或1GB。在获得需要保存的确切大小之前,我尚未实现用于缓冲所需数据的代码。
所以我的问题是
如果我不打算使用HDFS而是仅存储和检索S3的数据,是否应该考虑这个大小?
而且,如果我计划使用HDFS存储生成的.parquet文件,则最大每日数据集的最佳大小应该是10GB左右。
任何其他优化技巧将不胜感激!