我有一个数据框,有一行和几列.一些列是单个值,其他列是列表.所有列表列的长度都相同.我想将每个列表列拆分为一个单独的行,同时保持任何非列表列不变.
样本DF:
from pyspark import Row
from pyspark.sql import SQLContext
from pyspark.sql.functions import explode
sqlc = SQLContext(sc)
df = sqlc.createDataFrame([Row(a=1, b=[1,2,3],c=[7,8,9], d='foo')])
# +---+---------+---------+---+
# | a| b| c| d|
# +---+---------+---------+---+
# | 1|[1, 2, 3]|[7, 8, 9]|foo|
# +---+---------+---------+---+
Run Code Online (Sandbox Code Playgroud)
我想要的是:
+---+---+----+------+
| a| b| c | d |
+---+---+----+------+
| 1| 1| 7 | foo |
| 1| 2| 8 | foo |
| 1| 3| 9 | foo |
+---+---+----+------+
Run Code Online (Sandbox Code Playgroud)
如果我只有一个列表列,只需执行以下操作即可explode:
df_exploded = df.withColumn('b', explode('b')) …Run Code Online (Sandbox Code Playgroud) 我有一个pyspark数据框,由一列调用json,其中每一行都是一个json的unicode字符串.我想解析每一行并返回一个新的数据帧,其中每一行都是解析的json.
# Sample Data Frame
jstr1 = u'{"header":{"id":12345,"foo":"bar"},"body":{"id":111000,"name":"foobar","sub_json":{"id":54321,"sub_sub_json":{"col1":20,"col2":"somethong"}}}}'
jstr2 = u'{"header":{"id":12346,"foo":"baz"},"body":{"id":111002,"name":"barfoo","sub_json":{"id":23456,"sub_sub_json":{"col1":30,"col2":"something else"}}}}'
jstr3 = u'{"header":{"id":43256,"foo":"foobaz"},"body":{"id":20192,"name":"bazbar","sub_json":{"id":39283,"sub_sub_json":{"col1":50,"col2":"another thing"}}}}'
df = sql_context.createDataFrame([Row(json=jstr1),Row(json=jstr2),Row(json=jstr3)])
Run Code Online (Sandbox Code Playgroud)
我已尝试使用以下方法映射每一行json.loads:
(df
.select('json')
.rdd
.map(lambda x: json.loads(x))
.toDF()
).show()
Run Code Online (Sandbox Code Playgroud)
但这会返回一个 TypeError: expected string or buffer
我怀疑问题的一部分是,当从a转换为a dataframe时rdd,架构信息会丢失,所以我也尝试手动输入架构信息:
schema = StructType([StructField('json', StringType(), True)])
rdd = (df
.select('json')
.rdd
.map(lambda x: json.loads(x))
)
new_df = sql_context.createDataFrame(rdd, schema)
new_df.show()
Run Code Online (Sandbox Code Playgroud)
但我也是这样TypeError.
看看这个答案,看起来平坦化行flatMap可能在这里很有用,但我也没有成功:
schema = StructType([StructField('json', StringType(), True)])
rdd = (df
.select('json')
.rdd …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 Python 的logging模块为我的 AWS Glue 作业设置记录器。我有一个使用 Python 版本 3 的类型为“Python Shell”的 Glue 作业。
如果我不带任何实例化记录器name,日志记录工作正常,但是如果我给我的记录器一个name,它不再工作,并且我收到一个错误消息:Log stream not found.
我在示例 Glue 作业中有以下代码:
import sys
import logging
# Version 1 - this works fine
logger = logging.getLogger()
log_format = "[%(asctime)s %(levelname)-8s %(message)s"
# Version 2 - this fails
logger = logging.getLogger(name = "foobar")
log_format = "[%(name)s] %(asctime)s %(levelname)-8s %(message)s"
date_format = "%a, %d %b %Y %H:%M:%S %Z"
log_stream = sys.stdout
if logger.handlers:
for handler in …Run Code Online (Sandbox Code Playgroud) 我有一个类似于以下内容的 pyspark 数据框:
df = sql_context.createDataFrame([
Row(a=3, b=[4,5,6],c=[10,11,12], d='bar', e='utf friendly'),
Row(a=2, b=[1,2,3],c=[7,8,9], d='foo', e=u'ab\u0000the')
])
Run Code Online (Sandbox Code Playgroud)
其中列的值之一e包含 UTF 空字符\u0000。如果我尝试将其加载df到 postgresql 数据库中,则会收到以下错误:
ERROR: invalid byte sequence for encoding "UTF8": 0x00
Run Code Online (Sandbox Code Playgroud)
这是有道理的。在将数据加载到 postgres 之前,如何有效地从 pyspark 数据框中删除空字符?
我尝试pyspark.sql.functions先使用其中一些来清理数据,但没有成功。encode、decode、 并regex_replace没有起作用:
df.select(regexp_replace(col('e'), u'\u0000', ''))
df.select(encode(col('e'), 'UTF-8'))
df.select(decode(col('e'), 'UTF-8'))
Run Code Online (Sandbox Code Playgroud)
理想情况下,我想清理整个数据框,而不具体指定哪些列或违规字符是什么,因为我不一定提前知道这些信息。
我正在使用带编码的 postgres 9.4.9 数据库UTF8。
使用公式生成的Excel超链接似乎存在错误.我正在使用Excel 2010.我有一个包含URL的单元格的电子表格,我的目标是执行以下两项操作:
做#1,最初我只是使用了这个功能=HYPERLINK().所以,我的网址在列中A,我使用这个公式在列中创建超链接B.
为了做#2,我创建了以下宏,它应该用键盘快捷键Ctrl+ 打开超链接H:
Sub Open_Hyperlink()
'
' Open_Hyperlink Macro
'
' Keyboard Shortcut: Ctrl+h
'
Selection.Hyperlinks(1).Follow NewWindow:=False, AddHistory:=True
End Sub
Run Code Online (Sandbox Code Playgroud)
问题是这个宏似乎只适用于不使用公式创建的超链接.例如,如果我只是键入一个单元格http://www.google.com,Excel将自动使这个超链接和键盘快捷方式宏工作,其中它不与公式生成的超链接.
我还注意到,当我右键单击公式生成的超链接时,下拉菜单中没有选项可以打开超链接,但右键单击非公式生成的超链接时有选项.
我发现了以下解决方法.我没有使用公式生成超链接,而是使用了我在这里找到的宏.
Sub HyperAdd()
'Converts each text hyperlink selected into a working hyperlink
For Each xCell In Selection
ActiveSheet.Hyperlinks.Add Anchor:=xCell, Address:=xCell.Formula
Next xCell
End Sub
Run Code Online (Sandbox Code Playgroud)
我可以使用键盘快捷键打开使用此宏生成的超链接.我想知道是否有人有或有类似的问题,为什么公式生成的超链接不适合我.我希望将来使用公式来制作超链接,因为它更简单,所以如果有人知道避免使用宏来制作超链接的方法,我真的很感激.